promise.allsettled用于并发执行多个promise并保留每个任务最终状态(成功或失败),返回含status、value/reason的对象数组,支持统一分析所有结果。

Promise.allSettled 是专门用于并发执行多个 Promise 并**保留每个任务最终状态(无论成功或失败)**的方法,它不会因某个 Promise 拒绝而中断,也不会隐去错误细节——这正是它和 Promise.all 的核心区别。
为什么不用 Promise.all?
Promise.all 一旦遇到任意一个 rejected 状态,就立即 reject,其余仍在运行的 Promise 不会等待完成,你甚至拿不到它们的结果或错误原因。而真实业务中,比如批量提交表单、并行调用多个微服务接口、检查多个资源可用性,我们往往需要「全部试一遍,再统一分析成败」。
Promise.allSettled 返回什么结构?
它返回一个 Promise,兑现后得到一个数组,每个元素都是形如:
[
{ status: "fulfilled", value: "result1" },
{ status: "rejected", reason: Error("timeout") },
{ status: "fulfilled", value: 42 }
]
每个对象必含 status 字段(值为 "fulfilled" 或 "rejected"),根据 status 决定取 value 还是 reason。
如何安全提取每个任务的结果与错误?
推荐用 map 遍历结果数组,配合解构和条件判断:
- 用
status === "fulfilled"判断是否成功,取value - 用
status === "rejected"判断失败,取reason(它就是原始 reject 的值,可能是 Error 实例、字符串或任意类型) - 若需区分错误类型(如网络错误 vs 业务错误),可对
reason做 instanceof 或属性检查(例如reason?.response?.status)
实用示例:并发请求 3 个 API,汇总成败
假设你有三个 fetch 请求,其中第二个会 404:
const requests = [
fetch("/api/user"),
fetch("/api/missing"), // 404
fetch("/api/config")
];
Promise.allSettled(requests)
.then(results => {
results.forEach((result, i) => {
if (result.status === "fulfilled") {
console.log(`✅ 请求 ${i + 1} 成功`, result.value);
} else {
console.error(`❌ 请求 ${i + 1} 失败`, result.reason);
}
});
});
注意:fetch 本身不会因 HTTP 状态码 reject(404、500 仍算 fulfilled),如需按状态码分类,应在每个 fetch 后链式处理 .then(res => res.ok ? res : Promise.reject(res))。










