Promise.all默认只要有一个错误就直接返回错误。promise.all中任何一个promise 出现错误的时候都会执行reject,导致其它正常返回的数据也无法使用
Promise.all([
Promise.resolve(1),
Promise.reject('err'),
Promise.resolve(2)
]).then(res => {
console.log(res)
}).catch(err => {
console.log('error', err)
})
// 结果返回: error err
如果我们数组有某些错误但不影响其他结果返回,应该对每项promise进行捕获。
Promise.all([
Promise.resolve(1),
Promise.reject('err'),
Promise.resolve(2)].map(item => {
return item.catch(err => {
console.log('item error', err)
})
})
).then(res => {
console.log(res)
}).catch(err => {
console.log('error', err)
})
// 结果返回:
// item error err
// [1, undefined, 2]
这样就可以实现不管某个出现问题,不影响最后结果的返回。
Promise.all 简版实践原理
function promiseAll(promises){
return new Promise((resolve,reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError("argument must be anarray"))
}
let countNum=0;
let promiseNum=promises.length;
let resolvedvalue=new Array(promiseNum);
for (let i=0; i<promiseNum; i++) {
Promise.resolve(promises[i]).then(value =>{
countNum++;
resolvedvalue[i]=value;
if(countNum===promiseNum){
return resolve(resolvedvalue)
}
},reason => {
return reject(reason)
})
}
})
}