我想更好地了解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中的计时器函数有什么特别之处?
答案 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)