我正在阅读有关节点的事件循环阶段的信息,并说那是>>
- 计时器:此阶段执行由setTimeout()和setInterval()安排的回调。
- 待处理的回调:执行推迟到下一个循环迭代的I / O回调。
- 空闲,准备:仅供内部使用。
- poll:检索新的I / O事件;执行与I / O相关的回调(除close回调外,几乎所有这些回调由计时器和setImmediate()安排;节点将在此处阻塞适当。
- check:setImmediate()回调在这里被调用。
- 关闭回调:一些关闭回调,例如socket.on('close',...)。
因此,这里有一个简单的代码可以测试上述各个阶段。当您执行代码时,您将得到以下输出:
但是每个文档的套接字回调都处于最后阶段。为什么要先执行它?
let socket = require("net").createServer();
socket.on("data", function (data) {
console.log(data.toString());
});
socket.on("close", function (data) {
console.log("close");
});
socket.listen(8080);
const fs = require("fs");
fs.readFile("readme.txt", () => {
socket.close();
setTimeout(() => {
console.log("timeout");
}, 0);
setImmediate(() => {
console.log("immediate");
});
});
我正在阅读有关节点的事件循环阶段的信息,并说定时器:此阶段执行由setTimeout()和setInterval()安排的回调。待处理的回调:执行I / O回调...
首先,请记住,在本地关闭套接字触发的close
事件不是网络操作。它不是由网络事件触发的。它是由本地套接字实现决定的,该实现决定何时触发close事件,以通知监视该本地套接字的其他任何人它已关闭。它甚至可以同步触发(如果实现它的net
库选择这样做)。因此,您所了解的有关事件循环中网络事件的优先级或顺序的所有内容均不适用于此处。此事件不是由传入的网络操作触发的,并且不会作为网络操作流过事件循环。