Promise.allSettled()
和 Promise.all()
都是用于处理多个并行异步任务的静态方法,但它们对异步结果的处理逻辑有本质区别,核心差异在于“是否等待所有任务完成”和“如何处理失败任务”。
一、核心区别对比
特性 | Promise.all(iterable) |
Promise.allSettled(iterable) |
---|---|---|
成功条件 | 所有 Promise 都必须变为 fulfilled (全成功) |
无需等待所有成功,只要所有 Promise 都有结果(无论成功或失败) |
返回结果 | 返回所有成功结果的数组(按传入顺序) | 返回所有任务的“结果对象”数组,每个对象包含任务状态和值 |
失败处理 | 只要有一个 Promise 失败,立即返回该错误(快速失败) | 不会因任何任务失败而触发 catch ,始终等待所有任务完成 |
结果对象结构 | 直接返回原始成功值(如 [1, 2, 3] ) |
每个结果是对象: - 成功: { status: "fulfilled", value: 结果 } - 失败: { status: "rejected", reason: 错误 } |
二、代码示例对比
1. Promise.all()
:快速失败(一败全败)
const p1 = Promise.resolve(100);
const p2 = Promise.reject(new Error("任务2失败"));
const p3 = Promise.resolve(300);
Promise.all([p1, p2, p3])
.then(results => {
console.log("所有成功:", results); // 不会执行(因p2失败)
})
.catch(error => {
console.error("捕获错误:", error.message); // 输出:"任务2失败"
});
2. Promise.allSettled()
:等待所有结果(无论成败)
const p1 = Promise.resolve(100);
const p2 = Promise.reject(new Error("任务2失败"));
const p3 = Promise.resolve(300);
Promise.allSettled([p1, p2, p3])
.then(results => {
console.log("所有任务结果:", results);
/* 输出结果:
[
{ status: "fulfilled", value: 100 },
{ status: "rejected", reason: Error: 任务2失败 },
{ status: "fulfilled", value: 300 }
]
*/
})
.catch(error => {
console.error("捕获错误:", error); // 永远不会执行
});
三、适用场景
Promise.all()
:
适合所有任务必须全部成功的场景,例如:- 提交表单前,需验证多个字段的接口(所有验证通过才能提交);
- 加载页面所需的关键资源(如 CSS、JS、接口数据),缺一不可。
Promise.allSettled()
:
适合需要知道所有任务的执行结果(无论成败) 的场景,例如:- 批量操作反馈(如批量发送邮件,需统计成功/失败数量);
- 从多个数据源获取数据(部分源失败不影响其他源的结果处理)。
总结
Promise.all()
是“全有或全无”:所有成功才返回结果,一个失败则整体失败。Promise.allSettled()
是“等待所有结束”:无论成功失败,都会返回所有任务的详细结果,适合需要完整统计的场景。
选择时需根据业务是否能容忍部分任务失败来决定:若缺一不可用 all()
,若需完整结果用 allSettled()
。