依次await三个Promise却耗时仅5秒,为何看似并行执行?
为什么依次await三个Promise总耗时还是5秒?
问题的核心在于:Promise实例在被创建的那一刻,内部的异步操作就已经启动了,不是等到await的时候才开始执行。
看你的代码:
- 当
const promise1 = new Promise(...)这行代码执行时,Promise构造函数的回调会立刻运行,里面的setTimeout直接被推入事件循环,开始5秒的计时。 - 同理,
promise2和promise3的setTimeout也在代码初始化阶段同时启动,三个定时器是并行计时的。
而runPromises函数里的await只是在等待这些已经在运行的Promise完成:
- 第一个
await promise1会等待5秒,直到promise1resolve; - 此时
promise2和promise3的定时器已经跑完了,它们的状态已经是resolved,所以后面的await promise2和await promise3会直接返回结果,几乎不耗时。
所以整个程序的总耗时就是5秒,和用Promise.all()并行执行的效果一致。
如果想要让三个Promise串行执行(总耗时15秒),需要把Promise的创建放在await语句里,确保前一个Promise完成后再启动下一个:
async function runPromisesSerial() { const value1 = await new Promise(resolve => setTimeout(() => resolve(1), 5000)); console.log(value1); const value2 = await new Promise(resolve => setTimeout(() => resolve(2), 5000)); console.log(value2); const value3 = await new Promise(resolve => setTimeout(() => resolve(3), 5000)); console.log(value3); }
这样每个Promise的setTimeout会在前一个完成后才开始计时,总耗时就是3*5=15秒。
内容的提问来源于stack exchange,提问作者Akash Agarwal
相关产品推荐
相关产品推荐

