Promise.allSettled 返回一个永远 fulfilled 的 Promise,兑现后得到一个数组,每个元素为 { status: 'fulfilled', value: ... } 或 { status: 'rejected', reason: ... };适用于需获取所有异步任务终态的容错场景。

Promise.allSettled 是专门用来“不放弃任何一个”的批量异步处理工具——它不会因为某个任务失败就中断,而是等所有任务都结束(无论成功或失败),再统一返回每个任务的执行状态和结果。
它返回什么结构?
返回一个 Promise,兑现后得到一个数组,每个元素都是形如下面的对象:
- status: "fulfilled" → 对应 value 字段(成功值)
- status: "rejected" → 对应 reason 字段(拒绝原因,通常是 Error 实例)
例如:
{ status: "fulfilled", value: 42 },
{ status: "rejected", reason: new TypeError("Failed") },
{ status: "fulfilled", value: "done" }
]
怎么收集并分类分析结果?
拿到结果数组后,常用操作就是按 status 拆分、统计、提取数据:
立即学习“Java免费学习笔记(深入)”;
- 用 filter + map 提取所有成功值:
results.filter(r => r.status === "fulfilled").map(r => r.value) - 提取所有失败原因:
results.filter(r => r.status === "rejected").map(r => r.reason) - 快速判断是否有失败项:
results.some(r => r.status === "rejected") - 统计成功/失败数量:
results.filter(r => r.status === "fulfilled").length
典型使用场景示例
比如同时请求多个用户资料,允许部分失败,但要汇总报告:
const urls = ["/api/user/1", "/api/user/2", "/api/user/3"];const requests = urls.map(url =>
fetch(url).then(res => res.json()).catch(err => err)
);
Promise.allSettled(requests).then(results => {
const successes = results
.filter(r => r.status === "fulfilled")
.map(r => r.value);
const errors = results
.filter(r => r.status === "rejected")
.map(r => r.reason);
console.log("成功加载:", successes.length);
console.log("失败详情:", errors);
});
和 Promise.all / Promise.race 的关键区别
- Promise.all:一失败就拒,不等其余;适合“全成功才继续”的强一致性场景
- Promise.race:谁先结束(无论成败)就用谁,适合超时控制或竞速场景
- Promise.allSettled:一定等到全部结束,适合审计、批量上报、容错采集等弱一致性需求


















