关于在Promise.all数组元素中使用await的代码是否存在问题的技术问询
关于在Promise.all数组元素中使用await的代码是否存在问题的技术问询
嘿,这个问题抓得特别准——这段代码确实彻底浪费了Promise.all的核心价值,会导致严重的性能损耗,不过最终返回的结果倒是能保证正确,只是执行效率低得离谱。
我来拆解一下问题出在哪:
先看你写的代码:
const results = await Promise.all([ await asyncTask1(), await asyncTask2(), await asyncTask3() ]);这里的致命问题是:你在把任务传入Promise.all之前,就已经用
await逐个等待每个异步任务完成了。也就是说:- 代码会先卡住,直到
asyncTask1()完全执行完毕,拿到它的结果; - 只有等
asyncTask1彻底结束,才会开始执行await asyncTask2(),再次阻塞到它完成; - 最后才轮到
asyncTask3(),同样是串行等待。
- 代码会先卡住,直到
等这三个任务都串行执行完,你把三个结果(不是Promise对象)传给Promise.all,这时候Promise.all的作用仅仅是把这三个值包装成一个数组返回,完全没用到它并行执行异步任务的核心能力。
那正确的用法应该是怎样的?直接把异步任务返回的Promise对象传入Promise.all,让它去管理并行执行:
const results = await Promise.all([asyncTask1(), asyncTask2(), asyncTask3()]);
这种写法下,asyncTask1、asyncTask2、asyncTask3会同时启动执行,Promise.all会等待这三个任务全部完成后,一次性返回结果数组,总耗时等于这三个任务中执行时间最长的那个,而不是三个任务的时间总和,这才是Promise.all的正确打开方式。
最后再划个重点:
- 原代码的结果是正确的,但执行逻辑是串行的,完全违背了Promise.all的设计初衷;
- 正确写法的核心是直接传入Promise对象,而非await解包后的结果,这样才能利用异步并行的优势提升效率。
内容来源于stack exchange
相关产品推荐
相关产品推荐

