为什么Node.js事件循环需要多个阶段?

时间:2018-08-08 15:32:28

标签: javascript node.js loops callback queue

已通读了许多描述Node.js事件循环的文章和文档,例如Node.js本身提供的文章和文档:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

我根本无法解决这个问题:为什么事件循环需要几个阶段,每个阶段都有自己的回调队列?

所有文档和文章均以“该阶段如此执行并执行用X或Y设置的回调”的方式描述了循环的各个阶段,但是从来没有真正解释过为什么这些单独的队列首先是必要的。

为什么setTimeout()或setImmediate()或套接字关闭的回调需要在与轮询阶段不同的位置执行,而轮询阶段应该执行绝大多数的回调?

如果轮询阶段中的回调队列在移至下一阶段之前就已耗尽,那么为什么不将一个队列由于在其他阶段执行的任何与队列无关的操作而中断?

2 个答案:

答案 0 :(得分:1)

不必是这样的。一切都可能在一个队列中,但是可以肯定地认为NodeJS的创建者有某些理由可以做到这一点。我们知道Javascript是单线程的。因此,如果您说希望事件从现在起5秒钟发生,那么将没有其他线程可以确保该事件在指定时间真正运行。另一方面,无法预先确定给定功能是否会持续0.1秒(4.5秒)。

因此,即使他们不必像以前那样做,但将计时器功能放在高优先级队列中并首先处理它们具有客观利益。这样,系统将知道是否应紧急执行某些内容,并可以在处理其他所有内容之前紧急执行该内容。此外,系统将知道执行下一个计时器事件之前需要多少时间。

待处理的回调是系统等待的,因此它非常有用,并且将其放入第二个队列具有客观的好处,该队列的优先级低于计时器,但高于其他事物。

正如我们在民意调查部分所看到的,其行为取决于计时器队列的状态。

检查将执行轮询阶段中指定的一些事件。

close回调将在适当情况下处理回调中断。

因此,尽管我们必须承认这篇文章需要所有这些方面,但我必须承认,它需要比旨在澄清该文章的文章期望的更多思考。

简而言之,它不必按其工作方式工作。有许多种可能与此方法不同且有效的方法。

答案 1 :(得分:0)

该视频link可能比其他有关回调的材料描述得更好。 为了回答有关不同阶段的问题,请以本示例为例,并尝试根据官方文档link进行仿真,以获得更好的图像。

setTimeout(function(){
        console.log("the first block after 3 sec.");
},3000);
console.log("Hello after 3000");
setTimeout(function(){
        console.log("the second block after 1 sec.");
},1000);
console.log("Hello after 1000");
setTimeout(function(){
        console.log("the third block after 2 sec.");
},2000);
console.log("Hello after 2000");
setTimeout(function(){
        console.log("the last block after 0 sec.");
},0);
console.log("End after 0");