事件循环执行顺序错误

时间:2019-11-19 13:18:28

标签: javascript node.js callback event-loop

我有一个非常简单的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,因此应立即执行

1 个答案:

答案 0 :(得分:1)

书中没有任何内容说明I / O操作应该花费多长时间。假设零字节文件位于网络驱动器上。您仍然必须考虑网络的延迟,因此在这种情况下,您甚至可能会看到

Timeout 1
Immediate 1
Timeout 2
File 1

我将您的程序更改为使用fs.stat而不是fs.readFilestat操作应花费的时间与文件大小无关。在这种情况下,在我的机器上,我看到:

Timeout 1
File 1
Immediate 1
Timeout 2

...,这表明文件操作在下一个刻度上完成。但同样,不能保证会发生这种情况。如果文件的元数据不在缓存中,则程序仍然需要等待内核从磁盘中获取元数据,这是一个相对较慢的操作。


有趣的是,有时(也许每10次尝试一次)我会看到:

File 1
Immediate 1
Timeout 1
Timeout 2

这实际上意味着不能保证setTimeout(..., 0)在下一个滴答中执行。