promise.allsettled用于并行执行多个promise并等待全部完成(无论成功或失败),返回全 fulfilled 的结果数组,每个元素含status、value或reason字段,适合批量api调用等需全量收集结果的场景。

Promise.allSettled 专门用来并行执行多个 Promise,并等它们全部完成(无论成功或失败),再统一返回结果数组。它不因某个 Promise 拒绝而中断,适合需要“全量收集结果”的场景。
返回结构清晰,每个元素带 status 和 value/reason
它返回一个 Promise,该 Promise 总是 fulfilled(不会 rejected),其值是一个对象数组,每个对象包含:
- status: "fulfilled" → 对应 value 字段(成功值)
- status: "rejected" → 对应 reason 字段(拒绝原因,如 Error 实例)
例如:
const promises = [
Promise.resolve(1),
Promise.reject(new Error('fail')),
Promise.resolve('ok')
];
<p>Promise.allSettled(promises).then(results => {
console.log(results);
// [
// { status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: Error: fail },
// { status: 'fulfilled', value: 'ok' }
// ]
});
</p>适合需独立处理每个任务结果的并行场景
当你不希望一个失败拖垮整体,又需要知道每个请求是否成功、失败原因或返回值时,用 allSettled 比 all 更稳妥。常见于:
- 批量 API 调用(如同时查多个用户信息)
- 资源预加载(图片、脚本、样式表)并统计成功率
- 表单多字段异步校验,汇总所有校验结果
配合 filter / map 提取有用信息更高效
拿到结果后,通常要筛选成功项、提取值,或分类处理:
- 只取成功的 value:
results.filter(r => r.status === 'fulfilled').map(r => r.value) - 只取失败的 reason:
results.filter(r => r.status === 'rejected').map(r => r.reason) - 判断是否全部成功:
results.every(r => r.status === 'fulfilled')
注意:它仍会等待所有 Promise 完成,包括 pending 状态
如果某个 Promise 永远不 resolve/reject(比如没加超时),allSettled 就会一直挂起。建议为每个 Promise 加超时控制:
function timeout(p, ms) {
return Promise.race([
p,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('timeout')), ms)
)
]);
}
<p>const tasks = urls.map(url => timeout(fetch(url), 5000));
Promise.allSettled(tasks).then(/<em> ... </em>/);</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











