首先,docs已明确指出在I / O循环中,setImmediate()将始终在setTimeout()之前运行。困扰我的是,他们没有解释为什么它的功能如此,并且在他们的文档中的先前语句中寻找线索以某种方式向我指出了相反的结果(应首先调用setTimeout())。这就是原因:
当回调结束时,队列中不再有回调,因此事件循环将看到已达到最快定时器的阈值然后回到定时器阶段以执行定时器的回调< / p>
和
一旦轮询队列为空,事件循环将检查已达到时间阈值的计时器。如果一个或多个定时器准备就绪,事件循环将回绕到定时器阶段以执行那些定时器&#39;回调。
所以看起来事件循环优先排序之后要做的第一件事就是在轮询队列耗尽之后检查计时器并在它们被计时时回到那里。所以在这方面应该首先执行setTimeout()。
我没有能够在github中读取源代码的高级程序员,以了解libuv库如何在内部工作。非常感谢你们的帮助。
答案 0 :(得分:0)
事件循环仅沿顺时针方向移动,而不会向后移动。因此,为了进入计时器阶段,事件循环必须经过执行setImmediate回调的检查阶段。这就是为什么在I / O周期中将首先调用setImmediate,否则将首先调用setTimeout的原因。