关于Node.js如何处理setTimeout调度的调用的文档并不十分清楚:
Node.js不保证确切的时间 回调会发射,也不会发出命令 回调将尽可能接近指定时间。
说有一个过期的计时器。还有一些等待处理的I / O事件。在启动计时器之前,Node.js会选择先处理所有I / O事件吗?这就是WM_TIMER在Windows中的工作方式。我猜Node.js可能会以同样的方式运行。否则,为什么会有setImmediate()?人们可以使用带有0延迟的setTimeout()。
答案 0 :(得分:1)
当前的计时器在I / O处理程序之前处理。此外,如果您执行setTimeout(fn, 0)
,节点会安排下一个时钟的功能。
这是一个较旧的图表,大致显示了事件循环的一个循环中发生的事情:
虽然在节点v0.11 + / iojs中不再出现诸如关于process.maxDepth
的注释之类的事情。
答案 1 :(得分:0)
node.js中的事件循环(实际上是libuv)有几个阶段。在每个阶段中,处理某些特定类型的事件。当调用所有回调时,循环将进入下一阶段:https://github.com/libuv/libuv/blob/v1.x/src/unix/core.c#L314。
这意味着一种类型的事件不能抢占另一种事件。基本上没有单个队列,而是每个阶段的队列。