Promise.allSettled 返回各 Promise 完整状态对象,可手动统计成功率与失败率;遍历结果按 status 分类计数,并支持提取成功值或失败原因,且空数组、全失败等边界场景均适用。

Promise.allSettled 本身不直接提供“成功率/失败率”,但它返回每个 Promise 的完整状态(fulfilled 或 rejected),你可以基于结果手动统计。
获取每个请求的执行结果
它接收一个 Promise 数组,返回一个同样长度的数组,每个元素是形如 { status: 'fulfilled', value: ... } 或 { status: 'rejected', reason: ... } 的对象:
const requests = [
fetch('/api/user'),
fetch('/api/posts'),
fetch('/api/settings').then(() => { throw new Error('Timeout') })
];
<p>Promise.allSettled(requests)
.then(results => {
console.log(results);
// [
// { status: 'fulfilled', value: Response },
// { status: 'fulfilled', value: Response },
// { status: 'rejected', reason: Error }
// ]
});</p>统计成功与失败数量
遍历结果数组,按 status 分类计数即可:
Promise.allSettled(requests).then(results => {
const successCount = results.filter(r => r.status === 'fulfilled').length;
const failCount = results.length - successCount;
const successRate = (successCount / results.length * 100).toFixed(1) + '%';
const failRate = (failCount / results.length * 100).toFixed(1) + '%';
<p>console.log(<code>成功 ${successCount}/${results.length} (${successRate})</code>);
console.log(<code>失败 ${failCount}/${results.length} (${failRate})</code>);
});</p>同时提取成功数据和失败原因(实用增强)
实际开发中你可能还想拿到成功响应体、或失败的具体错误信息:
立即学习“Java免费学习笔记(深入)”;
- 用
results.map(r => r.status === 'fulfilled' ? r.value : null)提取所有成功响应(注意 null 占位) - 用
results.filter(r => r.status === 'rejected').map(r => r.reason)收集全部错误 - 若需进一步解析响应(如转 JSON),建议在原始 Promise 中处理,避免在 allSettled 后重复 try/catch
注意边界情况
空数组、单个请求、网络完全中断等场景都适用,但要注意:
- 即使所有请求都失败,
allSettled仍会 resolve,不会 reject —— 这正是它和all的关键区别 - 如果某个请求本身抛出未捕获异常(比如语法错误),它也会被归为
rejected状态 - 超时、跨域、4xx/5xx 响应默认仍是
fulfilled(因为 fetch 本身没报错),如需按 HTTP 状态码分类,得在 fetch 后手动检查response.ok


















