这两个都是 Promise 并发处理 的核心 API,用来同时执行多个 Promise ,最大的区别是:对失败的处理方式完全不同。
Promise.all :必须全部成功 ,一个失败就直接整体失败(短路失败)
Promise.allSettled :无论成功失败都等到底 ,返回所有结果(全部完成)
1. Promise.all()
特点:
- 接收一个 Promise 数组
- 所有 Promise 都成功 → 返回成功结果数组
- 只要有一个失败 → 立即触发失败,不会等待其他 Promise
- 适合:必须全部成功才能继续的场景(比如批量请求数据缺一不可)
javascript
const p1 = Promise.resolve('成功1');
const p2 = Promise.resolve('成功2');
const p3 = Promise.reject('失败3');
// 全部成功
Promise.all([p1, p2])
.then(res => console.log('all 成功:', res))
.catch(err => console.log('all 失败:', err));
// 有一个失败 → 直接整体失败
Promise.all([p1, p2, p3])
.then(res => console.log('all 成功:', res))
.catch(err => console.log('all 失败:', err));
2. Promise.allSettled()
特点:
- 接收一个 Promise 数组
- 等待所有 Promise 执行完成(不管成功 / 失败)
- 永远不会走到 catch ,返回一个结果对象数组
- 每个结果对象包含:
status: "fulfilled"+value:成功status: "rejected"+reason:失败
- 适合:需要知道每一个请求的结果(比如批量上传、批量校验)
javascript
const p1 = Promise.resolve('成功1');
const p2 = Promise.reject('失败2');
Promise.allSettled([p1, p2])
.then(results => {
console.log('allSettled 结果:', results);
});
// [
// { status: 'fulfilled', value: '成功1' },
// { status: 'rejected', reason: '失败2' }
// ]
3. 核心区别对比表
| 特性 | Promise.all | Promise.allSettled |
|---|---|---|
| 失败处理 | 一个失败 → 整体失败 | 全部执行完,返回所有结果 |
| 返回值 | 成功数据数组 / 失败原因 | 固定返回结果对象数组 |
| 状态 | 要么全成功,要么直接失败 | 永远是成功状态 |
| 适用场景 | 缺一不可、强依赖 | 收集所有结果、不关心部分失败 |
4. 实际使用场景
用 Promise.all
- 表单提交前多个接口必须全部成功
- 页面初始化必须加载完所有资源
- 批量创建数据必须全部创建成功
用 Promise.allSettled
- 批量上传文件(部分失败不影响其他)
- 批量获取用户信息(个别用户不存在也要展示其他)
- 需要统计成功 / 失败数量的任务
总结
- 缺一不可 → 用
Promise.all - 全部要结果 → 用
Promise.allSettled all会短路失败 ,allSettled会等待到底