promise.all要求全部成功才返回结果,任一失败即拒绝并丢弃其余结果;promise.allsettled则等待所有promise结束,无论成败均返回含status、value/reason的对象数组。

核心区别就一句话:Promise.all 要求“全胜”,一个失败就立刻放弃;Promise.allSettled 追求“全知”,不管成败都等结果回来。
失败时的行为完全不同
Promise.all 遇到第一个失败的 Promise,立刻终止所有后续执行,直接进 catch,其他还在跑的 Promise 结果全丢掉。比如拉用户、订单、通知三个接口,只要通知接口挂了,用户和订单哪怕已经成功响应,你也拿不到。
- Promise.all([p1, p2, p3]) → 其中 p2 失败 → 整体拒绝,只返回 p2 的错误
- Promise.allSettled([p1, p2, p3]) → p2 失败,p1 和 p3 仍继续执行 → 最终返回三组状态对象
返回值结构差异明显
Promise.all 成功时返回纯数据数组,失败时抛错;Promise.allSettled 永远走 then,返回固定格式的对象数组,每个对象带 status 字段标识状态:
- fulfilled → 含 value(成功结果)
- rejected → 含 reason(失败原因)
适用场景天然不同
选哪个,关键看你的业务能不能容忍“部分失败”:
- 用 Promise.all:登录后必须同时加载头像、权限、配置,缺一不可 → 任一失败就中断流程
- 用 Promise.allSettled:批量上传文件、同步多个系统状态、仪表盘聚合指标 → 需统计哪些成功、哪些失败,失败项可单独重试或告警
兼容性注意点
Promise.all 是 ES6 就支持的老成员,所有现代环境都没问题;Promise.allSettled 是 ES2020 新增的,Node.js 需 12.9.0+,浏览器基本全覆盖(Chrome 76+/Firefox 74+/Safari 14+),老版本需 polyfill。











