【问题标题】:NodeJs event loop keep switching between nextTick queue and promise microtask queueNodeJs 事件循环不断在 nextTick 队列和 Promise 微任务队列之间切换
【发布时间】:2022-10-06 01:10:27
【问题描述】:

请看下面的代码:

Promise.resolve().then(() => console.log(\"promise1 resolved\"));
Promise.resolve().then(() => console.log(\"promise2 resolved\"));
Promise.resolve().then(() => {
  console.log(\"promise3 resolved\");
  process.nextTick(() => {
    console.log(\"Inner Next tick\");
  });
});

Promise.resolve().then(() => console.log(\"promise4 resolved\"));

setImmediate(() => console.log(\"set immediate1\"));
setImmediate(() => console.log(\"set immediate2\"));

process.nextTick(() => console.log(\"next tick1\"));
process.nextTick(() => console.log(\"next tick2\"));

setTimeout(() => console.log(\"set timeout\"), 0);

这段代码的输出是:

next tick1
next tick2
promise1 resolved
promise2 resolved
promise3 resolved
promise4 resolved
Inner Next tick
set timeout
set immediate1
set immediate2

我无法理解的是为什么 innerTextTick 的回调,即 console.log(\"Inner Next tick\") 在 setTimeout 之前执行。 根据我的理解,首先将执行 nextTick 队列,nextTick 1 和 2,然后是所有已解决的 Promises,然后到 timers 阶段,这正如预期的那样。但是在第一个承诺中,我在 nextTick 队列中注册了一个新的 callBack,它应该在事件循环再次到达 nextTick 队列之后调用,即在计时器阶段之后。 但是为什么事件循环从承诺微任务队列返回而不是进入下一个阶段,即定时器队列。

    标签: node.js promise event-loop


    【解决方案1】:

    https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick:

    您可能已经注意到 process.nextTick() 没有显示在 图表,即使它是异步 API 的一部分。这是 因为process.nextTick() 在技术上不是事件的一部分 环形。相反,nextTickQueue 将在当前 操作已完成,与事件的当前阶段无关 环形。这里,操作被定义为从 底层 C/C++ 处理程序,并处理需要处理的 JavaScript 执行。

    回顾我们的图表,任何时候你打电话给process.nextTick() 在给定阶段,所有传递给process.nextTick() 的回调将是 在事件循环继续之前解决。

    【讨论】:

      【解决方案2】:

      因为在主执行文件的全局范围内,事件循环还没有发挥作用。全局中的所有 Promise.resolve() 进入 MicrotaskQueue,所有全局 nextTick 进入 nextTick 队列。因此,您的内部 nextTick 在 Event Loop 的 Timeouts Phase 首次运行之前进入 MicrotaskQueue 队列。这也是为什么promise4 resolved 甚至在Inner Next Tick 之前也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 2011-08-29
        • 2015-08-20
        • 2021-05-17
        • 1970-01-01
        • 2018-09-18
        • 2019-07-12
        相关资源
        最近更新 更多