hoping for a little confirmation on understanding of node.js execution model. I understand that when node.js process starts, this is the sequence of executions:
(from Jonas Schmedtmann's Udemy node.js course)
主要要点是顶层代码总是先执行any回调。
Then, in the event-loop, this is the sequence of the 'phases':
经过一番挖掘,我还确认了为什么在主模块中调用的 setTimeout 和 setImmediate 具有“任意”执行顺序,但是当从 I/O 阶段调用时,setImmediate 将始终首先执行,基于这篇文章:https://github.com/nodejs/help/issues/392#issuecomment-274032320 https://github.com/nodejs/help/issues/392#issuecomment-274032320.
(原因:假设定时器阈值已经过去,因为我们当前处于 I/O 阶段,之后的下一个阶段是执行 setImmediate 回调的检查处理阶段,立即执行总是在定时器之前执行。)
现在,当从一个阶段调用计时器和立即回调时,使得下一个阶段是到期计时器阶段(例如从主模块),如果顶级代码花费了足够长的时间以致计时器到期,则计时器回调将总是先执行,对吗?我已经用下面的代码对此进行了测试,它似乎是正确的(每次运行它时,计时器都会首先执行,即使与立即回调相比它有整整一秒的延迟)
setTimeout(() => {
console.log('timer completed');
}, 1000);
setImmediate(() => {
console.log('immediate completed');
});
for (let i = 0; i < 5000; i++) {
console.log(`top-level code: ${i}`);
}
所以这是我的问题:由于事件循环,假设顶级代码需要足够长的时间以便 I/O 操作在我们完成时完成,那么 I/O 操作回调不应该在立即回调之前执行吗?启动事件循环?
但是,下面的代码表明不然,因为执行顺序始终是:top-levels->timer->immediate->io
即使基于上面的模型,我应该期待:顶级 - >计时器 - > io - >立即(?)
setTimeout(() => {
console.log('timer completed');
}, 1000);
fs.readFile('test-file.txt', 'utf-8', () => {
console.log('io completed');
});
setImmediate(() => {
console.log('immediate completed');
});
for (let i = 0; i < 5000; i++) {
console.log(`top-level code: ${i}`);
}
谢谢你!