我有一个非常简单的Node.js示例,以了解事件循环
setTimeout(function() {
console.log("Timeout 1");
}, 0);
fs.readFile("test-file-empty.txt", () => {
console.log("File 1");
});
setTimeout(function() {
console.log("Timeout 2");
}, 100);
setImmediate(function() {
console.log("Immediate 1");
});
这给出了以下输出
Timeout 1
Immediate 1
File 1
Timeout 2
根据我对事件循环的理解,这些应该是以上示例中的ticks
或循环:
第一次打勾:
Timeout 1
File 1
Immediate 1
第二对勾:
Timeout 2
1)如果我对报价号和组成部分有误,请纠正我
2)为什么setImmediate
回调在fs.readFile
I / O回调之前执行,尽管setImmediate
应该在轮询阶段之后的Check阶段运行(该阶段处理I / O回调)?注意:该文本文件为空BTW,因此应立即执行
答案 0 :(得分:1)
书中没有任何内容说明I / O操作应该花费多长时间。假设零字节文件位于网络驱动器上。您仍然必须考虑网络的延迟,因此在这种情况下,您甚至可能会看到
Timeout 1
Immediate 1
Timeout 2
File 1
我将您的程序更改为使用fs.stat
而不是fs.readFile
。 stat
操作应花费的时间与文件大小无关。在这种情况下,在我的机器上,我看到:
Timeout 1
File 1
Immediate 1
Timeout 2
...,这表明文件操作在下一个刻度上完成。但同样,不能保证会发生这种情况。如果文件的元数据不在缓存中,则程序仍然需要等待内核从磁盘中获取元数据,这是一个相对较慢的操作。
有趣的是,有时(也许每10次尝试一次)我会看到:
File 1
Immediate 1
Timeout 1
Timeout 2
这实际上意味着不能保证setTimeout(..., 0)
在下一个滴答中执行。