Promise.all要求所有Promise都成功才fulfilled,否则立即rejected并返回首个失败原因;Promise.race则以首个settled(无论resolve或reject)的Promise结果为准,其余忽略。

Promise.all 和 Promise.race 是 JavaScript 中管理并发异步任务的两个核心工具,它们解决的是不同维度的问题:一个强调“全量协同”,一个专注“即时响应”。用对了,代码更健壮;用错了,可能掩盖错误或导致逻辑断裂。
Promise.all:适合强依赖、全量就绪的场景
它接收一个 Promise 数组,并行启动所有任务。只有全部成功,才进入 .then();只要有一个失败(哪怕最后一个),就立刻进入 .catch(),并返回第一个失败的原因。
- 结果数组顺序严格对应输入数组顺序,和执行快慢无关
- 适用于页面初始化加载用户信息、菜单、权限等缺一不可的数据
- 不适合容忍部分失败的批量操作——此时应改用 Promise.allSettled()
Promise.race:适合竞速、兜底或超时控制
它不等待全体,只认“第一个落地”的 Promise——无论 resolve 还是 reject,结果立刻返回,其余任务虽仍在后台运行,但其结果被忽略。
- 常用于给 fetch 请求加 5 秒超时:把请求和一个定时 reject 的 Promise 一起传入 race
- 可用于多 CDN 源取最快响应、A/B 实验快速回滚、按钮防抖竞态取消等场景
- 注意:如果第一个完成的是 reject,整个 race 就失败,需在 .catch() 中处理,不能默认认为“有结果就是成功”
别踩坑:常见误用与替代方案
想并行执行多个任务又不想因单个失败中断整体?Promise.all 不是唯一选择。
- 需要“全部执行完,不管成败” → 用 Promise.allSettled(),它返回每个 Promise 的 status + value/reason
- 任务数量大(如上传 100 个文件)→ 避免一次性全开,改用“Promise 池”控制并发数(如最多同时 3 个)
- 想按顺序执行但保持链式可读性 → 用 reduce + Promise 或 for...of + await,而非硬套 all/race
怎么选?看任务关系
问自己三个问题:
- 这些异步操作之间是否相互依赖?(是 → all;否 → 可能 race 或 allSettled)
- 我是否必须拿到每一个结果?(是 → all 或 allSettled;只需一个 → race)
- 我能接受某个任务失败导致其他任务“白跑”吗?(不能 → allSettled 或手动封装)

















