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方法指定的回调函数。

参考自ES6-Promise.all