promise对象里resolve和reject状态讲解及Promise.all()的使用
首先来说下同步异步与阻塞非阻塞的概念,同步异步与阻塞非阻塞并没有关系。同步异步主要是事情做完以后,如何进行处理、或者说关注的是一种消息通信机制。
同步的情况下,是由处理消息者自己去等待消息是否被触发;
而异步的情况下是由触发机制来通知处理消息者
举例:
所以同步异步可以说是对被请求方来说的,被请求者使用什么方式来告知处理结果
- 思考,思考。。。。。。。,好了,有答案了,当场告诉你 -------- 同步
- 这个问题需要一点时间,你先做点别的,等我想好了,去找你。 --------异步
阻塞非阻塞,主要是对于请求者而言的
- 阻塞:发出请求等待结果返回,然后再处理后续的事情
- 非阻塞:发出请求不等待结果返回,可以接着做后续的事情
上代码:
/**当我们new Promise会得到一个Promise对象,该对象会有一个任务要完成,同时该对象会维护一个状态
PromiseStatus
1:pending:正在处理
2:resolved:已完成
3:rejected:失败*/
let p1 = new Promise(function(resolve,reject){
/**要做的事情通过一个函数来完成,该函数会接收两个值
resolve
reject
这两个参数都是一个函数,当我们调用他们的时候,会改变当前任务的状态
resolve() => resolved
reject() => rejected */
setTimeout(() => {
var a = Math.random();
if(a < 0.5){
console.log(a,'p1失败')
reject(a)
}else{
console.log(a,'p1成功')
resolve(a)
}
},1000)
})
/**Promise对象还有一个then方法,当前任务成功的时候,会调用该方法,并执行该方法传入函数参数
then方法接收两个参数,它们都是函数
第一个参数是当前状态为resolved时候执行
第二个参数是当前状态为rejected时候执行*/
p1.then(a => {
console.log('成功',a)
},a => {
console.log('失败',a)
})
/**虽然then方法中的参数接收两个
一个是成功的callback
一个是失败的callback
但是,在书写的时候,如果每一个then都传这两个callback的话,编写过程太麻烦,为了能够统一的处理失败Pormise对象又提供了一个新的方法:catch,catch方法也接收一个callback
只要有一个Promise的状态变成了rejected,那么就会被catch方法捕获,执行catch的callback*/
.then((a) => {
return new Promise((resolve,reject) => {
setTimeout(() => {
a *= a;
console.log(a,'p1成功')
reject(a);
},1000)
})
}).then((a) => {
console.log(a,'p1的then里成功')
}).catch((a) => {
console.log(a,'失败捕获')
})
看打印出来的结果:
当p1中的随机数a < 0.5时,就直接进入catch里捕获到失败了,后面的then都不会执行

当p1中的随机数a > 0.5时,就进入到第一个then里,第一个then里又有一个promise对象,但是执行的是reject函数,所以就会直接到catch里捕获到失败

情形:在一个Promise任务中需要处理多个异步任务,这多个的异步任务是同时进行的,但是执行时间是不确定的,后续的任务需要这几个异步任务全部完成之后在执行,这时候就需要用到Promise里面提供的all方法来实现
var p1 = new Promise((resolve,reject) => {
let a = 1;
setTimeout(() => {
a++;
resolve(a);
},Math.random() * 1000)
})
var p2 = new Promise((resolve,reject) => {
let b = 2;
setTimeout(() => {
b++;
resolve(b);
},Math.random() * 1000)
})
/**把两个不同的异步任务分别包装在一个Promise对象里,然后调用Promise对象静态方法all,把上面多个不同异步Promise作为数组传递给all方法的参数,当多个异步任务的状态都变成resolve,那么all的状态才是resolved,但是只要有一个异步任务的状态变成了rejected,那么all的状态就会变成rejected*/
Promise.all([p1,p2]).then(([a,b]) => {
console.log(a,b)
}).catch((err) => {
console.log(err)
})
打印台:

over~
promise对象里resolve和reject状态讲解及Promise.all()的使用的更多相关文章
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
本文同步自我的个人博客: http://mly-zju.github.io/ 众所周知javascript语言的一大特色就是异步,这既是它的优点,同时在某些情况下也带来了一些的问题.最大的问题之一,就 ...
- Promise对象的resolve回调函数和reject回调函数使用
Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...
- JavaScript异步与Promise基本用法(resolve与reject)
Promise解决的问题相信每个前端都遇到过这样一个问题,当一个异步任务的执行需要依赖另一个异步任务的结果时,我们一般会将两个异步任务嵌套起来,这种情况发生一两次还可以忍,但是发生很多次之后,就形成了 ...
- resolve和reject不会终结Promise的参数函数的执行
- 16. Promise对象
目录 Promise对象 一.含义 1. Promise是什么 2. 实例讨论 二.Promise特性案例解析 1. Promise的立即执行性 2. promise的三种状态 3. Promise的 ...
- 谈谈 ES6 的 Promise 对象
https://segmentfault.com/a/1190000002928371 前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般 ...
- Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)
1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- 通过一道笔试题浅谈javascript中的promise对象
因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ...
随机推荐
- Jenkins(3)- 安装Jenkins过程中遇到问题的排查思路
如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 安装Jenkins过程中,可能会遇 ...
- ansible的剧本play(四)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA68AAAETCAYAAADZDzDOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw
- MySQL join的7种理论及SQL写法
转载于 https://www.cnblogs.com/dinglinyong/p/6656315.html 建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE d ...
- HDU 5416 CBR and tree
#include<bits/stdc++.h> using namespace std; #define for(i,a,b) for(int i=a;i<=b;++i) //T,N ...
- BigDecimal 01 - 在JAVA中怎么比较Double类型数据的大小?
2019独角兽企业重金招聘Python工程师标准>>> 非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型! double a = 0.001; doub ...
- 【K8S】K8S部署Metrics-Server服务
写在前面 在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存.磁盘.CPU和网络的使用率等信息. 读者可参考< ...
- 升级vue项目中的element-ui的版本
首先卸载项目中的element-ui 命令为: npm uninstall element-ui / cnpm uninstall element-ui 安装更新最新的element-ui 命令为 n ...
- POJ 2188 Cow Laundry
Cow Laundry Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1376 Accepted: 886 Descriptio ...
- 线程池(Java中有哪些方法获取多线程)
线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...
- Spring官网阅读(七)容器的扩展点(二)FactoryBean
在上篇文章中我们已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍.其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程 ...