javascript - Node.js 事件循环阶段

标签 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

谢谢。

最佳答案

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

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

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

在上面的队列优先于在下面的队列。在您的代码片段中,setTimeout 函数将被传递到计时器队列(它是一个不同的数据结构,但可以使用队列)并且需要 1000 毫秒才能执行。

所以事件循环首先查看计时器,因为没有任何东西可以移动到函数运行的调用堆栈,事件循环将检查作为 Node 本身一部分的另外 2 个队列。因此,在跳转到下一个 libuv 队列之前, Node 首先会检查这两个队列

Next Ticks Queue — 使用 process.nextTick 函数添加的回调 Other Microtasks Queue — 包括其他微任务,例如已解决的 promise 回调。

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

Started

Finishes

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

Started
Finishes
timeout callback...

关于javascript - Node.js 事件循环阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47633547/

相关文章:

javascript - || 的和 NaN 运算符。它们到底是如何运作的?

node.js - 我可以在模块外使用 NestJS Config Service 吗?

javascript - Koa.js 中止正在运行的请求

javascript - Heroku Node.js 错误 : ReferenceError: server is not defined

javascript - 如何保护html值

javascript - 为什么最后一个元素总是在悬停时触发?

javascript - 尝试测试回调中设置的变量

javascript - 使用 fetch api 在 react 中发帖

node.js - 总是需要删除 node_modules 并再次重新安装软件包才能使 npm run prod 正常工作

javascript - 如何监听 TCP 数据包获取数据并使用 node.js 发送 UDP