理解Node.js中Event Loop(七)

理解Node.js中Event Loop(七)

本文翻译至:Visualizing the Close Queue in the Node.js Event Loop

欢迎阅读我们关于可视化 Node.js 事件循环系列的第七篇也是最后一篇文章。在上一篇文章中,我们探讨了执行异步代码时的检查队列及其优先级顺序。在本文中,我们将看一下事件循环中的最后一个队列,即 close 队列

目录

添加回调函数到队列

我们开始本系列的最后一个实验之前,我想指出关闭队列包含与异步任务的关闭事件关联的回调。下面是向 close 队列添加回调函数的示例:

readableStream.on("close", () => {
  console.log("this is from readableStream close event callback");
});

实验14

index.js
const fs = require("fs");

const readableStream = fs.createReadStream(__filename);
readableStream.close();

readableStream.on("close", () => {
  console.log("this is from readableStream close event callback");
});

setImmediate(() => console.log("this is setImmediate 1"));
setTimeout(() => console.log("this is setTimeout 1"), 0);
Promise.resolve().then(() => console.log("this is Promise.resolve 1"));
process.nextTick(() => console.log("this is process.nextTick 1"));

首先,我们导入 fs 模块。然后,我们使用 fs.createReadStream() 创建一个可读流。之后,我们使用 close() 方法关闭流。我们侦听流关闭时发出的 close 事件,并添加一个侦听器来打印“this is from readableStream close event callback”。

之后,我们有一些熟悉的方法: setImmediate()setTimeout()Promise.resolve().then()process.nextTick()

调用堆栈执行完所有语句后,除 I/O 队列外,每个队列中都会有一个回调。当主线程空闲时,控制进入事件循环。

首先, nextTick 队列中的回调被出队并执行。然后,promise 队列中的回调出队并执行,然后是Timer队列回调。

接下来,事件循环移至check队列并出列并执行其回调。最后,控制权移至close队列,最终回调从队列中出列并执行。

由实验14推断

close队列回调在事件循环的 给定周期中的所有其他队列回调之后 执行。


结论

事件循环是一个 C 程序,用于协调 Node.js 中同步和异步代码的执行。它管理六个不同的队列: nextTick 、promise、timer、I/O、check 和 close。

  • 要将任务添加到 nextTick 队列,我们​​使用 process.nextTick() 方法。

  • 要将任务添加到 Promise 队列中,我们需要resolve或reject Promise。

  • 要将任务添加到Timer队列,我们​​使用 setTimeout()setInterval()

  • 为了将任务添加到 I/O 队列,我们​​执行一个异步方法。要将任务添加到检查队列,我们​​使用 setImmediate() 函数。

  • 最后,要将任务添加到 close 队列中,我们附加关闭事件侦听器。

执行顺序遵循此处列出的相同顺序。但是,值得注意的是,nextTick 和 Promise 队列在每个队列之间执行,也在Timer队列 和 check队列中的每个回调执行之间执行。


此系列文章:

理解Node.js中Event Loop(一)

理解Node.js中Event Loop(二)

理解Node.js中Event Loop(三)

理解Node.js中Event Loop(四)

理解Node.js中Event Loop(五)

理解Node.js中Event Loop(六)

理解Node.js中Event Loop(七)