JavaScript中async/await下Promise为何提前启动setTimeout计时?
问题解析:async/await中Promise的执行时机
核心点:Promise在被创建的那一刻就已经开始执行了,不是等到await的时候才启动。
咱们一步步拆解你的代码执行流程:
- 代码一开始就创建了
p1,此时它内部的setTimeout立刻开始计时5秒; - 紧接着创建
p2,它内部的setTimeout也立刻开始计时10秒——这俩计时器是同时跑的; - 调用
test()函数,遇到await p1,此时test函数会暂停执行,等待p1的状态变为resolved; - 5秒后
p1resolve,test函数恢复执行,先打印res1,再打印hello world; - 这时候
p2已经跑了5秒了,还剩5秒就会resolve,所以await p2只需要再等5秒,就能拿到结果并打印。
针对你的两个疑惑:
为什么p2不是p1完成后才计时?因为
p2的Promise在代码最开始就已经初始化了,计时器早就启动,await只是等待它完成,不是触发它开始执行。如果想让p2在p1完成后才启动,得把p2的创建放到await p1之后:async function test() { const res1 = await new Promise((resolve) => setTimeout(() => resolve('p1 fulfilled'), 5000)); console.log(res1); console.log('hello world'); const res2 = await new Promise((resolve) => setTimeout(() => resolve('p2 fulfilled'), 10000)); console.log(res2); } test();这样p2的计时器会在p1完成后才启动,
await p2就需要等10秒。为什么
hello world没有提前打印?因为await p1会暂停test函数的整个执行流程,必须等p1resolve后,才会继续执行后面的代码。p2的并行执行是在test函数外部的事件循环里,不影响test函数内部代码的串行执行顺序。
内容的提问来源于stack exchange,提问作者Razeun
相关产品推荐
相关产品推荐

