为何两段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
相关产品推荐
相关产品推荐

