Promise
对象接受一个函数作为参数,该函数的两个参数分别是resolve和reject,这两个参数都是回调函数
reslove包裹的数据为then的参数(回调函数)的参数data
reject包裹的数据为catch的参数(回调函数)的参数d
Promise
有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)
一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和从pending
变为rejected
。只要这两种情况发生,状态就凝固了,不会再变了
所以上面代码如果reslove在reject前面 状态从pending
变为fulfilled
将调用then打印111
如果reject在reslove前面 状态从pending
变为rejected
将调用catch打印555
链式调用
在then中如果返回一个promise对象 可以在下一个then方法中拿到其传给resolve的值
上面代码将最后打印666
promise.all()该方法用于将多个Promise实例,包装成一个新的Promise实例。
var p = Promise.all([p1,p2,p3]);
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
请看下面示例:需要注意的是,promise.all()成功时,在then(result)中result是个数组
- let p1 = new Promise((resolve, reject) => {
- resolve('成功了')
- })
-
- let p2 = new Promise((resolve, reject) => {
- resolve('success')
- })
-
- let p3 = Promise.reject('失败')
-
- Promise.all([p1, p2]).then((result) => {
- console.log(result) //['成功了', 'success']
- }).catch((error) => {
- console.log(error)
- })
-
- Promise.all([p1,p3,p2]).then((result) => {
- console.log(result)
- }).catch((error) => {
- console.log(error) // 失败了,打出 '失败'
- })
Promise.race()
函数返回一个 Promise
,写法和all一样 它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。
Promise.race([p3,p1, p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error)
})
简单解析: race含有竞速的意思,将多个Promise放在一个数组中,数组中有一个promise最先得到结果,不管是" 完成(resolved)"还是" 失败(resolved)" , 那么这个 .race 方法就会只返回这个结果,其他结果就不用管了。