Node.js中的计时器有什么特别之处?

时间:2015-10-22 02:20:08

标签: javascript node.js timer event-loop

我想更好地了解Event Loop。我阅读了文档,文章,Node.js的API文档。几乎所有人都将计时器分开:

setImmediate():

  

setImmediate(callback [,arg] [,...])

     

安排“立即”   在I / O事件回调之后执行回调,在setTimeout之前执行   和setInterval

process.nextTick():

  

process.nextTick(callback [,arg] [,...])#

     

这不是 setTimeout(fn,0)的简单别名,它更多   高效。它在任何其他I / O事件之前运行(包括   计时器)在事件循环的后续滴答中触发。

为什么呢?在Event Loop的上下文中Node.js中的计时器函数有什么特别之处?

2 个答案:

答案 0 :(得分:1)

这些都与对回调的异步执行进行非常精细的控制有关。

nextTick()函数最快执行到调用它的位置。它的名字来自事件循环“tick”。 Tick代表event loop的完整转弯,其中不同类型的事件(例如计时器,io,网络)耗尽一次。即使今天的名称令人困惑,因为它已经改变了节点版本的语义。 nextTick()回调与调用代码在同一个tick中执行。在nextTick()回调函数中添加更多nextTick()会聚合它们,并在同一个tick中调用它们。

setImmediate()给出第二近的执行次数。它与setTimeout(0)几乎相同,但它在所有传统的setTimeout()和setInterval()计时器之前调用。它在下一个滴答开始时作为第一件事处理。您可以获得一种异步执行的快速通道,该通道对传统的setInterval()和setTimeout()具有特权。在setImmediate()中添加更多setImmediate()回调本身会将它们推迟到下一个tick,并且它们不会在相同的tick中执行,与nextTick()的方式相反。这个setImmediate()函数最初是nextTick()的语义,因此名称为nextTick()。

setTimeout() setInterval()然后按预期工作,具有第三个最接近的执行点(如果超时很长,则更晚)。

答案 1 :(得分:1)

简单地说,他们调用的顺序是:nextTick() - > setImmediate() - > setTimeout(fn,0)