Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Node.Js事件循环执行_Node.js_Event Loop - Fatal编程技术网

了解Node.Js事件循环执行

了解Node.Js事件循环执行,node.js,event-loop,Node.js,Event Loop,我是node.js新手,正在尝试理解事件循环。正如我们所知,process.nextTick()不是事件循环的一部分。所以,有人能解释一下process.nextTick()回调是否会在事件循环开始之前执行吗?请在说明中包括不同的node.js事件循环阶段状态 process.nextTick(() => { console.log("3") console.log('nextTick'); }); console.log(

我是node.js新手,正在尝试理解事件循环。正如我们所知,process.nextTick()不是事件循环的一部分。所以,有人能解释一下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');
      });

让我试试

您可以在此处找到有关节点事件循环的简要(16分钟)说明:


官方指南(由@estus提及)是最好的解释:


要获得更深入的解释,请查看这一系列博客帖子:


根据:

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

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

 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);
close
3
nextTick
1
timeout
2
immediate
这是输出:

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

回到您的示例。

这是程序的输出:

 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);
close
3
nextTick
1
timeout
2
immediate
说明:

  • 文本:“关闭”-首先打印-因为节点已处理输入脚本
  • 文本:“3';”nextTick'-打印秒-因为来自nextTickQueue的回调是在事件循环启动之前运行的
  • 文本:“1”timeout'-打印第三个-因为setTimeout或setInterval计划的回调在计时器阶段(第一阶段)运行
  • 文本:“2';”立即”-打印第四个-因为“setImmediate”计划的回调在检查阶段(第五阶段)运行
  • 希望这个长答案能让事情变得清楚。

    让我试试看

    您可以在此处找到有关节点事件循环的简要(16分钟)说明:


    官方指南(由@estus提及)是最好的解释:


    要获得更深入的解释,请查看这一系列博客帖子:


    根据:

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

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

     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);
    
    close
    3
    nextTick
    1
    timeout
    2
    immediate
    
    这是输出:

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

    回到您的示例。

    这是程序的输出:

     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);
    
    close
    3
    nextTick
    1
    timeout
    2
    immediate
    
    说明:

  • 文本:“关闭”-首先打印-因为节点已处理输入脚本
  • 文本:“3';”nextTick'-打印秒-因为来自nextTickQueue的回调是在事件循环启动之前运行的
  • 文本:“1”timeout'-打印第三个-因为setTimeout或setInterval计划的回调在计时器阶段(第一阶段)运行
  • 文本:“2';”立即”-打印第四个-因为“setImmediate”计划的回调在检查阶段(第五阶段)运行
  • 希望这个长答案能让事情变得清楚。

    不同之处在于