Promise.allSettled 用于并发执行多个 Promise 并等待全部完成,返回每个 Promise 的状态(fulfilled 或 rejected)及对应 value 或 reason,适用于需全量收集结果的容错场景。

Promise.allSettled 是 JavaScript 中用于并发执行多个 Promise 并**等待全部完成(无论成功或失败)**的方法。它不会像 Promise.all 那样在任一 Promise 拒绝时就整体失败,而是返回每个 Promise 的最终状态(fulfilled 或 rejected),非常适合需要“全量收集结果、不因个别失败而中断”的场景,比如批量接口请求、资源预加载、日志上报等。
基本用法:传入 Promise 数组,返回状态对象数组
它接收一个 Promise 实例数组,返回一个新的 Promise,该 Promise 在所有输入 Promise 都 settled(即 fulfilled 或 rejected)后兑现,其值是一个对象数组,每个对象包含 status 字段和对应的结果或原因:
-
status: "fulfilled"→ 含value字段(原始 resolve 值) -
status: "rejected"→ 含reason字段(原始 reject 值,通常是 Error 实例)
示例:
const requests = [
fetch('/api/user/1'),
fetch('/api/user/2'),
fetch('/api/user/3').then(() => { throw new Error('Network timeout'); })
];
Promise.allSettled(requests)
.then(results => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`Request ${index} succeeded:`, result.value);
} else {
console.error(`Request ${index} failed:`, result.reason);
}
});
});
配合 async/await 使用更清晰
在 async 函数中,用 await 更直观地处理结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
async function fetchAllUsers() {
const responses = await Promise.allSettled([
fetch('/api/users/1'),
fetch('/api/users/2'),
fetch('/api/users/3')
]);
const data = [];
const errors = [];
responses.forEach((res, i) => {
if (res.status === 'fulfilled') {
data.push(res.value.json()); // 注意:fetch 返回 Response,还需 .json()
} else {
errors.push({ index: i, error: res.reason });
}
});
// 等待所有成功响应解析为 JSON
const jsonResults = await Promise.allSettled(data);
return { jsonResults, errors };
}
⚠️ 注意:fetch 成功返回的是 Response 对象,需调用 .json() 才能获取数据;而 .json() 本身也返回 Promise,所以常需二次 Promise.allSettled 或 Promise.all 处理。
与 Promise.all 和 Promise.race 的关键区别
- Promise.all:任一 Promise 失败 → 整体立即 reject;全部成功 → 返回值数组。适合“全成功才继续”的强一致性场景。
- Promise.race:谁最先 settled(不论成败)→ 整体就以它的结果 settle。适合超时控制、竞速请求。
- Promise.allSettled:一定等到全部结束;返回每个 Promise 的完整状态。适合容错、审计、汇总统计。
实用技巧:过滤出成功/失败项,或提取值
常用操作封装:
// 获取所有成功响应的 value(忽略失败) const fulfilledValues = results .filter(r => r.status === 'fulfilled') .map(r => r.value); // 获取所有失败的 reason const rejectedReasons = results .filter(r => r.status === 'rejected') .map(r => r.reason); // 判断是否“全部成功” const allSucceeded = results.every(r => r.status === 'fulfilled'); // 判断是否“至少一个成功” const hasSuccess = results.some(r => r.status === 'fulfilled');

















