promise.all() 实现并发请求但结果按输入顺序排列,任一失败则整体失败;需容错可用 promise.allsettled() 或内部 catch;串行依赖应使用 await 链或 then 链。

JavaScript 中并发请求的执行流程顺序,关键不在“谁先完成谁先返回”,而在于“结果按你提交的顺序排列”——这正是 Promsie.all() 的核心能力。
用 Promise.all() 实现并发 + 顺序结果
它让所有请求同时发出(真正并发),但最终结果数组严格对应你传入 Promise 的索引顺序,和响应快慢无关。
- 把每个请求包装成独立 Promise,按你想要的逻辑顺序放进一个数组里
- 调用
Promsie.all([p1, p2, p3]),所有请求立刻并行发起 -
then回调收到的结果一定是[p1结果, p2结果, p3结果],哪怕 p3 其实最先返回 - 只要有一个 Promise 被 reject,整个
all就立即失败;如需容错,可提前在每个 Promise 内部用.catch()捕获并转为正常值(例如返回null或默认对象)
需要严格串行时别误用 all
如果业务逻辑要求“第二个请求必须等第一个响应后才发起”,那就不该用并发。这时应使用链式 await:
- 写成
const a = await fetchA(); const b = await fetchB(a); - 或用
.then()链:fetchA().then(a => fetchB(a)).then(b => ...) - 注意:每个
await都会暂停当前 async 函数,后续代码必须等它结束才能执行
混合场景:部分并发、部分顺序
比如前两个接口可以并发,第三个要等前两个都返回后再发:
- 先
const [a, b] = await Promise.all([fetchA(), fetchB()]); - 再
const c = await fetchC({ a, b }); - 这样既利用了并发提速,又保证了依赖关系正确
错误处理要匹配执行模型
并发模式下,错误处理策略和串行不同:
- 用
Promise.all()时,默认是“全成功才成功”,任一失败即中断 - 若希望所有请求都发完、不管成败都拿到结果,改用
Promise.allSettled() - 每个 Promise 内部加
.catch(e => ({ error: true, data: null })),可统一返回结构,避免中断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











