Promise.allSettled 是 ES2020 引入的原生方法,用于等待所有 Promise 结束并返回每个结果的状态和值,无论成功或失败;它返回数组,每个元素含 status('fulfilled'/'rejected')及对应 value 或 reason。

Promise.all 默认遇到任一 Promise 拒绝(reject)就会立即失败,不等其余 Promise 完成,更不会返回已成功的数据。若想“即使某个请求失败,也要拿到其他成功的结果”,不能直接用 Promise.all,而要用 Promise.allSettled —— 它会等待所有 Promise 结束(无论 fulfilled 还是 rejected),并返回每个结果的状态和值。
用 Promise.allSettled 替代 Promise.all
Promise.allSettled 是 ES2020 引入的原生方法,专为这种“全量收集结果”场景设计。它返回一个数组,每个元素都是形如 { status: 'fulfilled' | 'rejected', value | reason } 的对象。
- status 为
'fulfilled'表示请求成功,结果在value字段 - status 为
'rejected'表示请求失败,错误在reason字段 - 所有请求都会执行完毕,互不影响
提取成功数据的实用写法
拿到 allSettled 的结果后,用 filter + map 快速提取成功响应:
const requests = [
fetch('/api/user'),
fetch('/api/posts'),
fetch('/api/profile')
];
Promise.allSettled(requests)
.then(results => {
const successfulResponses = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value); // 注意:这里只是 Response 对象,还需 .json() 等解析
return Promise.all(
successfulResponses.map(res => res.json())
);
})
.then(data => {
console.log('所有成功请求的解析结果:', data);
});
处理混合类型(如部分需 JSON、部分需 text)
如果不同请求需要不同解析方式(比如有的要 .json(),有的要 .text()),建议把 fetch 和解析逻辑封装进单个 Promise:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 每个子 Promise 自行处理自己的响应解析和错误兜底
- 例如返回
{ data: ..., error: null }或{ data: null, error: ... }统一结构 - 这样 allSettled 后可直接按字段取值,无需二次解析
兼容旧环境(无 Promise.allSettled)的降级方案
若需支持较老浏览器(如 IE 或早期 Node.js),可用 Promise.all + 封装成“永不拒绝”的 Promise:
function ignoreReject(promise) {
return promise
.then(value => ({ status: 'fulfilled', value }))
.catch(reason => ({ status: 'rejected', reason }));
}
Promise.all(requests.map(ignoreReject))
.then(results => {
// 用法与 allSettled 完全一致
});
不复杂但容易忽略:Promise.allSettled 不是“容错版 Promise.all”,而是“全量结果收集器”,它的设计初衷就是解决这类问题。优先用它,清晰又可靠。

















