事件循环执行顺序错误

问题描述 投票:0回答:1

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

javascript node.js callback event-loop
1个回答
0
投票

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

Timeout 1
Immediate 1
Timeout 2
File 1

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

Timeout 1
File 1
Immediate 1
Timeout 2

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


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

File 1
Immediate 1
Timeout 1
Timeout 2

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.