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' }
// ]
});
</font></p><H3>适合需独立处理每个任务结果的并行场景</H3><p>当你不希望一个失败拖垮整体,又需要知道每个请求是否成功、失败原因或返回值时,用 <strong>allSettled</strong> 比 <strong>all</strong> 更稳妥。常见于:</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill7377" title="Java Maven Secondary Analysis"><img
src="https://img.php.cn/upload/skill/000/000/081/179144831942131.jpg" alt="Java Maven Secondary Analysis" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill7377" title="Java Maven Secondary Analysis">Java Maven Secondary Analysis</a>
<p>分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。</p>
</div>
<a href="/xiazai/skill7377" title="Java Maven Secondary Analysis" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a></a>”;</p><ul><li>批量 API 调用(如同时查多个用户信息)</li><li>资源预加载(图片、脚本、样式表)并统计成功率</li><li>表单多字段异步校验,汇总所有校验结果</li></ul><H3>配合 filter / map 提取有用信息更高效</H3><p>拿到结果后,通常要筛选成功项、提取值,或分类处理:</p><ul><li>只取成功的 value:<code>results.filter(r => r.status === 'fulfilled').map(r => r.value)</code></li><li>只取失败的 reason:<code>results.filter(r => r.status === 'rejected').map(r => r.reason)</code></li><li>判断是否全部成功:<code>results.every(r => r.status === 'fulfilled')</code></li></ul><H3>注意:它仍会等待所有 Promise 完成,包括 pending 状态</H3><p>如果某个 Promise 永远不 resolve/reject(比如没加超时),<strong>allSettled</strong> 就会一直挂起。建议为每个 Promise 加超时控制:</p><font size="2"><pre class="brush:php;toolbar:false;">
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>

















