为什么 setImmediate() 总是在 I/O 回调 [NodeJS] 中的 setTimeout() 之前运行?



首先,文档已经明确指出,在一个 I/O 周期中,setImmediate(( 将始终在 setTimeout(( 之前运行。困扰我的是他们没有解释为什么它那样工作,并且在他们的文档中的先前陈述中寻找线索以某种方式向我指出了相反的情况(应该首先调用 setTimeout((。原因如下:

当回调

完成后,队列中不再有回调,因此事件循环将看到已达到最快计时器的阈值,然后回包装到计时器阶段以执行计时器的回调

轮询队列为空后,事件循环将检查已达到时间阈值的计时器。如果一个或多个计时器准备就绪,事件循环将回绕到计时器阶段以执行这些计时器的回调。

因此,似乎事件循环在耗尽轮询队列后优先做的第一件事就是检查计时器并在超时时换回那里。所以在这方面,它应该是首先执行 setTimeout((。

我不是高级程序员,可以在 github 中阅读源代码以了解 libuv 库的内部工作方式。非常感谢你们的一些帮助。

事件循环仅顺时针移动,不会向后移动。因此,为了进入计时器阶段,事件循环必须经过执行 setImmediate 回调的检查阶段。这就是为什么在 I/O 周期中,将首先调用 setInstant,否则将首先调用 setTimeout。

最新更新