当 Promise.all() 接收的可迭代对象中有一个 Promise 被拒绝(状态变为 rejected) 时,会触发快速失败(fail-fast) 机制,具体表现为:
立即终止执行
Promise.all()会立刻停止等待其他 Promise,无论其他 promise 是处于pending(进行中)还是fulfilled(已成功)状态。返回被拒绝的原因
新生成的 promise 会立即变为rejected状态,并将第一个被拒绝的 promise 的错误原因(即reject()传递的参数)作为自己的拒绝原因。忽略后续结果
其他未完成的 promise 即使后续变为fulfilled或rejected,也不会影响Promise.all()的最终结果(已因第一个错误而终止)。
示例代码
// 三个异步任务:1个失败,2个成功
const p1 = Promise.resolve("成功1");
const p2 = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("任务2失败")), 500); // 第一个失败
});
const p3 = new Promise((resolve) => {
setTimeout(() => resolve("成功3"), 1000); // 虽然后续会成功,但被忽略
});
Promise.all([p1, p2, p3])
.then(results => {
console.log("所有成功:", results); // 不会执行
})
.catch(error => {
console.error("捕获错误:", error.message); // 输出:"捕获错误:任务2失败"
});
关键结论
Promise.all() 对错误非常敏感,只要有一个 promise 失败,整个批量操作就会立即失败,且仅返回第一个错误。这一特性要求使用时必须通过 catch() 处理可能的错误,避免未捕获的异常导致程序中断。
如果需要等待所有 promise 完成(无论成功或失败),可使用 Promise.allSettled() 替代,它会返回所有 promise 的结果(包含成功和失败信息)。