Node.js事件循环阶段

时间:2017-12-04 12:35:55

标签: javascript node.js

我是node.js的新手,我已经浏览了node.org上给出的事件循环文档。

有声明:当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入REPL,本文档未涉及),这可能会进行异步API调用,安排定时器,或调用process.nextTick(),然后开始处理事件循环。

我已阅读每个阶段的文档,但无法完全理解。

假设我在index.js中有以下代码:

console.log('started...');
setTimeout(function(){
    console.log('timeout callback...');
},1000);
console.log('Finishes...');

我想知道我的整个代码首先加载到哪个阶段,以及在运行命令时如何将事件循环用于上面的代码

node index.js

感谢。

2 个答案:

答案 0 :(得分:0)

好的,您应该看到started ..然后Finishes语句后跟timeout callback

如上所述,eventLoop进行异步API调用,即在执行setTimeout函数时不等待下一阶段调用(使用节点Timers)。 Nodejs等待1000毫秒以完成回调,另一个THREAD和finishes早先运行。

答案 1 :(得分:0)

解复用器是Node JS中的通知发布接口。它用于以事件的形式收集来自监视源的每个请求,并将每个事件排入队列。是构成事件队列的多路分解器。事件多路分解器是由Libuv运行的API。

队列是使用先进先出(FIFO)原理的顺序排序的数据结构:按插入顺序将项目从队列中删除。如果事件队列中没有事件,或者事件多路分解器没有待处理的请求,则程序将完成。

这是由事件多路分解器(由libuv)形成的事件队列的图。  enter image description here

最上面的队列比下面的队列优先。在您的代码段中,setTimeout函数将传递给计时器队列(这是一个不同的数据结构,但允许使用队列),并且将花费1000毫秒来执行。

因此,事件循环首先查看计时器,因为没有什么要移动到调用函数运行的堆栈,因此事件循环将检查属于节点本身的其他两个队列。因此,在跳到下一个libuv队列之前,节点首先将检查这两个队列

Next Ticks Queue” —使用process.nextTick函数添加的回调 其他微任务队列-包括其他微任务,例如已解决的Promise回调。

2个控制台功能将在其他微任务队列中挂起。因此,事件循环会将这些函数传递给要执行的调用堆栈。

Started

Finishes

将被记录到控制台。由于没有其他事情要做,事件循环将一直等到1000毫秒,然后将setTimeout函数传递给要执行的调用堆栈。这就是您将在控制台上看到的内容。

Started
Finishes
timeout callback...