Promise.all如果其中之一失败,怎么能够拿到其他成功的结果
Promise.all 的基础介绍
作用:Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
参数:由多个Promise实例组成的数组
const p = Promise.all([p1, p2, p3]);
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Demo–Promise.all如果其中之一失败,怎么能够拿到其他成功的结果
该实例的最终结果被Promise.all的catch方法捕获
如果f3没有自己的catch方法,就会调用Promise.all()的catch方法。
let f1 = new Promise((resolve,reject)=> {
setTimeout(()=> {
resolve('f11111')
},2000)
})
let f2 = new Promise((resolve,reject)=> {
setTimeout(()=> {
resolve('f22222')
},1000)
})
let f3 = new Promise((resolve,reject)=> {
setTimeout(()=> {
reject('err-f33333')
},3000)
})
let a = [f1,f2,f3]
// promise.all中的异步请求是并发执行的,但是最终的返回结果是按照最初的顺序执行排列好的
Promise.all(a).then(data=> {
console.log(data)
}).catch(err=> {
console.log('糟糕出错了')
})
//执行结果:糟糕出错了
如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。
let f1 = new Promise((resolve,reject)=> {
setTimeout(()=> {
resolve('f11111')
},2000)
})
let f2 = new Promise((resolve,reject)=> {
setTimeout(()=> {
resolve('f22222')
},1000)
})
let f3 = new Promise((resolve,reject)=> {
setTimeout(()=> {
reject('err-f33333')
},3000)
}).catch(err=>err)
let a = [f1,f2,f3]
// promise.all中的异步请求是并发执行的,但是最终的返回结果是按照最初的顺序执行排列好的
Promise.all(a).then(data=> {
console.log(data)
}).catch(err=> {
console.log('糟糕出错了')
})
// 执行结果: ['f11111', 'f22222', 'err-f33333']
这个例子中f1,f2会resolved。
f3首先会rejected,但是f3有自己的catch方法,该方法返回的是一个新的Promise 实例, f3指向的实际上是这个实例. 该实例执行完catch方法后,也会变成resolved。 导致Promise.all()方法参数里面的三个实例都会resolved,因此会调用then方法指定的回调函数,而不会调用catch方法指定的回调函数。