You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依次await三个Promise却耗时仅5秒,为何看似并行执行?

为什么依次await三个Promise总耗时还是5秒?

问题的核心在于:Promise实例在被创建的那一刻,内部的异步操作就已经启动了,不是等到await的时候才开始执行。

看你的代码:

  • 当const promise1 = new Promise(...)这行代码执行时,Promise构造函数的回调会立刻运行,里面的setTimeout直接被推入事件循环,开始5秒的计时。
  • 同理,promise2和promise3的setTimeout也在代码初始化阶段同时启动,三个定时器是并行计时的。

而runPromises函数里的await只是在等待这些已经在运行的Promise完成:

  1. 第一个await promise1会等待5秒,直到promise1 resolve;
  2. 此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:01:07