2017-01-13 46 views
4

如果调用process.nextTick()多次,是在回调的顺序执行?是否按顺序调用process.nextTick的回调函数?

换句话说,它的节点事件循环给予相同的优先级所有来电process.nextTick,并且在FIFO顺序执行呢?

例如:

process.nextTick(() => console.log('1')) 
process.nextTick(() => console.log('2')) 

process.nextTick(() => 
    process.nextTick(() => console.log('3')) 
) 

process.nextTick(() => 
    process.nextTick(() => console.log('4')) 
) 

请问这种总是打印1 2 3 4

+1

嗯,在[文档](https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md)谈论队列...可以尽管如此,在这个问题上找不到明确的信息。 – Caramiriel

+1

即使他们最终打印1234不依赖于它。基本上,从不依赖于无证件的“功能”,因为它们可能会因优化等原因而在将来随时更改。 – slebetman

回答

2

docs中没有写入正在使用的队列,我找不到解释它的官方源代码,所以我查看了source code,它看起来像是您指出的FIFO队列。

检查回调如何每个nextTick()后被推入nextTickQueue阵列,以及它们是如何之后执行,以便在_tickCallback(),在while循环的每次迭代递增索引tickInfo[kIndex]

我想在你的榜样第三和第四回调将不会在队列中的第一和第二的同时,但是无论如何他们会按照这个顺序执行。

顺便说一句,即使是执行的FIFO的顺序预期的方式,这是一个未公开的行为,因此不建议依赖于它;内部的东西可以随时更改。

+0

感谢您的研究!换句话说,这是目前的行为,但不能保证它会保持如此 – slezica

+0

不客气!是的,我同意@slebetman的评论,这是内部的东西,所以它可以随时更改。我为未来的读者添加了解释。 –