Promise.all的注意事项
星期一, 9月 30, 2024 | 1分钟阅读 | 更新于 星期一, 9月 30, 2024
Promise.all()的定义
- Promise.all() 接收一个可迭代对象(例如数组)作为参数,该对象包含多个 Promise。它会返回一个新的 Promise,当且仅当传入的所有 Promise 都成功时,返回的 Promise 才会被解析(fulfilled),并且返回一个包含每个 Promise 成功结果的数组。
- 如果其中有任何一个 Promise 失败(rejected),整个 Promise.all() 返回的 Promise 会立即失败,并抛出第一个失败 Promise 的错误。其他 Promise 即使还在进行中,也会被忽略。
注意点
当抛出第一个失败时,其他的promise中的代码是直接停止还是还会继续执行呢?答案是继续执行,只是它的promsie的值不会被promsie.all 所接受。 示例代码:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('failed on promise1');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('虽然被丢弃,依然执行1')
resolve('succeed on promise2');
console.log('虽然被丢弃,依然执行2')
}, 2000);
});
Promise.all([promise1, promise2]).then((res) => {
console.log('all promise.then', res);
}).catch((err) => {
console.error('all promise.catch ', err);
}).finally(()=>{
console.log('all promise.finally ');
});
上面的执行结果是:
`all promise.catch failed on promise1`
`all promise.finally `
`虽然被丢弃,依然执行1`
`虽然被丢弃,依然执行2`
有趣吧,结论是Promise.all中某一个失败并不能阻止剩余promise的执行(只是结果被丢弃)。所以如果我们想在所有的promsie都settled(拒绝或者成功),应该使用:Promise.allSettled
,然后再根据promsie的结果判断执行相应的逻辑。