Promise.any 返回第一个成功结果,全部失败时抛出含所有错误的 AggregateError;Promise.allSettled 返回每个 Promise 的确定状态(fulfilled/rejected)及对应值或原因,永不拒绝。

Promise.allSettled 和 Promise.any 是现代 JavaScript 中处理多异步任务的两个关键补充,它们不追求“全胜”或“速决”,而是分别聚焦于“全盘掌握”和“择优而取”。选对方法,能让错误更可控、响应更及时、逻辑更贴近真实业务。
Promise.any:要的是第一个可用结果
它适合那些“有就行,快就好”的场景。只要有一个 Promise 成功,就立刻返回那个值,其余仍在运行的 Promise 不会中断,但结果被忽略。
- 典型用途:从多个 CDN 加载同一张图片,用最快响应的那个
- 典型用途:调用多个功能相同的服务实例(如用户认证服务的冗余部署),任一可用即登录成功
- 注意点:全部失败时抛出 AggregateError,需用
err.errors访问所有失败原因,不能直接用err.message
Promise.allSettled:要的是每一份执行反馈
它不关心成败,只确保“每个都跑完”。最终返回一个数组,每个元素明确标注 status("fulfilled" 或 "rejected")以及对应 value 或 reason。
- 典型用途:批量上传 10 个文件,需要知道哪几个成功、哪几个因网络/格式失败
- 典型用途:同时更新多个用户通知状态,部分失败不影响其他操作,但需记录日志供排查
- 注意点:返回值永远是 fulfilled 状态,不会触发
.catch();错误需在 then 中逐项判断处理
和 all/race 的关键区别在哪
对比其他两个常用方法,能更清楚定位 any 和 allSettled 的不可替代性:
- vs Promise.all:all 是“全有或全无”,any 是“有一个就行”,allSettled 是“不管有没有,先记下来”
- vs Promise.race:race 是“谁先变谁说了算”(成功或失败都算),any 只认成功,失败全忽略直到全败
怎么选?看你的业务目标
一句话判断:
- 需要“至少一个可靠结果” → 用 Promise.any
- 需要“每个操作的确定结论” → 用 Promise.allSettled
- 需要“全部到位才推进” → 回归 Promise.all
- 需要“抢速度、控超时” → 用 Promise.race


















