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

为何两段await语句会并行执行?await被定义为串行操作

问题原因解释

这个运行结果完全符合ECMAScript规范,核心原因是对Promise和await的执行时机存在误解:

  • Promise实例在创建时就已经开始执行,不是等到await时才启动
    你代码里先后执行了let b = a1()、let b2 = a1(),这两行执行时两个a1函数已经被同步调用,两个内部的setTimeout几乎同时被注册到事件循环,都设置了100ms后触发resolve,两个Promise从这个时间点开始就处于并行运行的状态。
  • await只是暂停当前async函数等待已有Promise完成,不会重置Promise的执行进度
    第一个await b等待的100ms过程中,第二个b2对应的Promise也在同时倒计时,等100ms到的时候,两个Promise几乎同时完成resolve。所以第二个await b2不需要再额外等待,直接就能拿到已经完成的Promise的结果。

总耗时自然就是两个Promise并行执行的100ms,而不是串行的200ms,这个行为完全符合规范要求,属于合法运行结果。

如果你想要实现预期的串行200ms效果,应该等第一个Promise执行完成后再创建第二个Promise,写法如下:

async function run() {
  let t1 = Date.now();
  let c = await a1(); // 先等待第一个Promise执行完成,再创建第二个
  let c2 = await a1();
  console.log(Date.now() - t1); // 此时输出就是200ms左右
}

内容的提问来源于stack exchange,提问作者huseyin tugrul buyukisik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:45:05