了解Node.Js事件循环执行

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

我是node.js的新手,并试图了解事件循环。我们知道,process.nextTick()不是Event Loop的一部分。那么,任何人都可以解释在事件循环开始之前是否会执行process.nextTick()回调吗?请在解释中包含不同的node.js事件循环阶段状态。


     process.nextTick(() => {
        console.log("3")
        console.log('nextTick');
      });

    console.log("close")

    setTimeout(() => {
        console.log("1")
        console.log('timeout');
      }, 0);

      setImmediate(() => {
        console.log("2")
        console.log('immediate');
      });

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

让我尝试 您可以在此处找到关于节点事件循环的简短(16分钟)说明: https://www.youtube.com/watch?v=PNa9OMajw9w&list=PLw5h0DiJ-9PCIrjcodoAZdA4CcCarnCOo&index=2 官方指南(@estus提到)是最好的解释: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ 有关更深入的解释,请查看以下系列博文: https://jsblog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810 根据official guide

您可能已经注意到process.nextTick()没有显示在图中,即使它是异步API的一部分。这是因为process.nextTick()在技术上不是事件循环的一部分。相反,nextTickQueue将在当前操作完成后处理,而不管事件循环的当前阶段如何。 回顾一下我们的图,每当你在给定阶段调用process.nextTick()时,传递给process.nextTick()的所有回调都将在事件循环继续之前得到解决。

因此,process.nextTick()回调将在每个事件循环的tick中执行,而不是在事件循环开始之前执行。 让我用这个简单的程序演示:

 process.nextTick(() => console.log("process.nextTick before"));
 const intervalId = setInterval(() => {
   console.log("interval");
   process.nextTick(() => console.log("process.nextTick from interval"));
 }, 1000);
 process.nextTick(() => console.log("process.nextTick after"));

 setTimeout(() => {
   clearInterval(intervalId);
   console.log("Interval was cleared - nothing more to run - the event loop will stop - program will stop");
 }, 5000);

这是输出:

process.nextTick before
process.nextTick after
interval
process.nextTick from interval
interval
process.nextTick from interval
interval
process.nextTick from interval
interval
process.nextTick from interval
Interval was cleared - nothing more to run - the event loop will stop - program will stop

说明:

  • process.nextTick(()=> console.log(“process.nextTick from interval”));将回调放入nextTickQueue(也称为微任务队列)。因此,在第一个文本“间隔”之后但在下一个文本“间隔”之前打印文本'process.nextTick from interval'。来自微任务队列的所有回调将在事件循环继续到下一阶段之前运行(参见官方指南中的上述引用)。
  • 文本'process'nextTick before'和'process.nextTick after'在第一个间隔文本之前打印,因为nextTickQueue是在事件循环开始之前处理的。来自official guide: 当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入REPL,本文档未涉及),这可能会进行异步API调用,调度计时器或调用process.nextTick(),然后开始处理事件循环。

回到你的例子。 这是您的程序的输出:

close
3
nextTick
1
timeout
2
immediate

说明:

  1. text:'close' - 首先打印 - 因为节点已经处理了输入脚本
  2. 文字:'3'; 'nextTick' - 打印第二 - 因为来自nextTickQueue的回调是在事件循环开始之前运行的
  3. 文字:'1'; 'timeout' - 打印第三 - 因为setTimeout或setInterval调度的回调在定时器阶段运行 - 第一阶段
  4. 文字:'2'; '立即' - 打印第四 - 因为'setImmediate'安排的回调是在检查阶段 - 第五阶段运行的

希望这个长期答案能让事情变得清晰。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.