理解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
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队列中的每个回调执行之间执行。
此系列文章: