+
16
-

回答

Promise.allSettled 和 Promise.all 是 JavaScript 中用于处理多个 Promise 的两个方法,但它们的行为有显著区别,适用于不同场景。以下是它们的核心差异:

1. 失败处理

Promise.all

特点 :只要有一个 Promise 被拒绝(rejected),整个 Promise 会立即失败。

适用场景 :需要所有任务都成功完成的情况(例如并发请求多个 API,任一失败则终止流程)。

示例 :

const p1 = Promise.resolve(3);
const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, '出错了'));
const p3 = Promise.resolve('foo');

Promise.all([p1, p2, p3])
.then(values => console.log(values)) // 不会执行
.catch(error => console.error(error)); // 立即输出 "出错了"

Promise.allSettled

特点 :无论所有 Promise 是否成功,都会等待它们全部完成(fulfilled 或 rejected),最终返回每个 Promise 的状态和结果。

适用场景 :需要知道所有任务的结果(无论成功或失败),例如批量处理、并行计算后统计结果。
Promise.allSettled([p1, p2, p3])
.then(results => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`任务 ${index} 成功: ${result.value}`);
} else {
console.log(`任务 ${index} 失败: ${result.reason}`);
}
});
});
// 输出:
// 任务 0 成功: 3
// 任务 1 失败: 出错了
// 任务 2 成功: foo

2. 返回结果结构

Promise.all

返回值:一个数组,包含所有 Promise 的 成功值 (按输入顺序排列)。

如果任意一个 Promise 被拒绝,则直接进入 .catch()。

Promise.allSettled

返回值:一个对象数组,每个对象包含以下属性:

status: 'fulfilled' 或 'rejected'

value: 成功时的值(仅当 status 为 fulfilled 时存在)

reason: 失败时的错误(仅当 status 为 rejected 时存在)

3. 使用场景对比

需要所有任务都成功

Promise.all

任一失败则终止流程

需要统计所有任务结果(无论成功/失败)

Promise.allSettled

所有任务完成后返回完整结果

仅需第一个成功/失败的结果

Promise.race

与本文无关,但常被提及

总结

选择 Promise.all :当所有任务必须成功完成,否则整个流程失败(例如并发请求多个依赖项)。

选择 Promise.allSettled :需要完整了解所有任务的最终状态(例如批量操作后的结果分析)。

网友回复

我知道答案,我要回答