Promise.allSettled 是用于并行执行多个 Promise 并收集全部终态结果(成功或失败)的方法,返回每个 Promise 的 status、value 或 reason;与 Promise.all 不同,它不因任一拒绝而中断,而是等待所有完成。

Promise.allSettled 是 JavaScript 中用于并行执行多个 Promise 并**收集全部结果(无论成功或失败)**的标准方案,适合需要“不因单个失败而中断、且必须拿到每个任务终态”的场景。
它和 Promise.all 的核心区别
• Promise.all:任一 Promise 拒绝(reject),整个 Promise 立即拒绝,其余未完成的可能被丢弃(实际仍在运行,但结果不可见);只返回成功值数组。
• Promise.allSettled:等待所有 Promise 都进入终态(fulfilled 或 rejected),返回一个对象数组,每个对象含 status("fulfilled" / "rejected")、value 或 reason 字段。
基本用法与返回结构
```js
const promises = [
Promise.resolve(42),
Promise.reject(new Error('Oops')),
Promise.resolve('hello')
];
Promise.allSettled(promises)
.then(results => {
console.log(results);
// [
// { status: 'fulfilled', value: 42 },
// { status: 'rejected', reason: Error('Oops') },
// { status: 'fulfilled', value: 'hello' }
// ]
});
```
常用处理模式
• 分离成功与失败结果:
```js
const results = await Promise.allSettled(promises);
const fulfilled = results.filter(r => r.status === 'fulfilled').map(r => r.value);
const rejected = results.filter(r => r.status === 'rejected').map(r => r.reason);
```
• 带索引的错误定位:配合 map((r, i) => ({ ...r, index: i })),便于知道第几个请求出错。
• 统一兜底逻辑:例如所有请求都失败时提示“网络异常”,部分失败时仍渲染可用数据。
兼容性与降级方案
• 原生支持:Chrome 76+、Firefox 71+、Safari 13.1+、Node.js 12.9+。
• 旧环境需 polyfill,可用 promise.allsettled npm 包,或手动实现(基于 Promise.all + 错误捕获包装):
```js
function allSettled(promises) {
return Promise.all(
promises.map(p =>
Promise.resolve(p).then(
value => ({ status: 'fulfilled', value }),
reason => ({ status: 'rejected', reason })
)
)
);
}
```










