为什么Promise.resolve()之后会发生setTimeout

问题描述 投票:0回答:1

在事件循环中有:

  1. 事件循环的各个阶段,每个阶段都包含自己的回调队列
  2. 微任务队列,其中包括已解决的 Promise 回调

据我了解,微任务队列在事件循环的每个阶段之后运行。

事件循环的第一阶段是“计时器”阶段。请参阅此处:https://blog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810

因此给出这段代码:

setTimeout(() => console.log('TIMEOUT')); 
Promise.resolve().then(() => console.log('PROMISE'); 

我希望读取日志

TIMEOUT
PROMISE

但是你会得到

PROMISE
TIMEOUT

我知道“PROMISE”日志来自微任务队列中的回调。但定时器阶段是第一阶段。如果在每个阶段我们首先运行回调队列,然后运行微任务队列,为什么我在微任务队列中的日志之后看到计时器日志?

node.js event-loop
1个回答
0
投票

因为您的代码是从任务运行的,并且在这个初始任务之后,已经有一个微任务检查点,就像每个任务之后一样。

图中不是很清楚,但即使你有 33 个计时器回调在同一阶段触发,它们都会清空

nextTick
队列和微任务队列,所以会有大约 33 个这样的检查点。

© www.soinside.com 2019 - 2024. All rights reserved.