Promise.allSettled 用于等待所有 Promise 完成并返回每项的状态与结果,成功为 {status:"fulfilled",value:…},失败为 {status:"rejected",reason:…},需按 status 分别处理,适用于需全量反馈的容错场景。

Promise.allSettled 是专门用来获取一组异步任务“全部完成后的状态”的方法,不管成功还是失败,它都会等所有 Promise 都 settle(即进入 fulfilled 或 rejected 状态),然后返回一个数组,每个元素都包含对应 Promise 的结果和状态。
返回值结构:每个结果都是带 status 的对象
Promise.allSettled 返回的是一个 Promise,它 resolve 一个数组,数组中每个对象都有两个固定字段:status(字符串,值为 "fulfilled" 或 "rejected"),以及 value(成功时的返回值)或 reason(失败时的错误)。不能只用 .then 拿 value,必须先判断 status。
- 成功项:{ status: "fulfilled", value: 实际返回值 }
- 失败项:{ status: "rejected", reason: 错误对象 }
如何安全提取所有结果(含错误信息)
遍历返回数组,用 if/else 或 switch 区分 status,分别处理成功和失败情况。注意:reason 是原始错误,可直接 console.error 或记录日志;value 是业务数据,可存入变量或进一步处理。
- 不要用 try/catch 包裹 allSettled 调用本身——它本身不会 reject
- 不要对单个 Promise 做 .catch —— allSettled 已接管错误捕获
- 推荐用 Array.prototype.forEach 或 map 显式分类,比如 filter 出所有失败项做统一告警
和 Promise.all 的关键区别
Promise.all 在任意一个 Promise reject 时就立刻 reject,且不返回其他已完成的结果;而 allSettled 完全不关心失败,一定等全部结束,确保你能拿到每项的最终状态。适合需要“尽力执行、全量反馈”的场景,比如批量上传、并发请求校验、资源预加载等。
立即学习“Java免费学习笔记(深入)”;
- all:追求“全成功”,失败即中断,适合强一致性流程
- allSettled:追求“全知情”,失败也留痕,适合监控、汇总、容错型任务
简单示例:混合成功与失败的请求
假设同时请求三个接口,其中第二个会 404:
const results = await Promise.allSettled([
fetch('/api/user'),
fetch('/api/missing'),
fetch('/api/config')
]);
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`第${index + 1}个成功`, result.value);
} else {
console.error(`第${index + 1}个失败`, result.reason);
}
});
这样就能清晰看到哪几个拿到了响应,哪几个出了错,且不影响其他请求的结果处理。


















