代码1:
function foo() {
console.log('foo');
}
process.nextTick(foo);
console.log('bar');
码2:
function foo() {
console.log('foo');
}
foo();
console.log('bar');
第一段代码输出:
bar
foo
,第二个是相反的:
foo
bar
为什么?
我的问题是:
谢谢你们。
答案 0 :(得分:2)
process.nextTick(foo)
调度foo()
。它通过在事件队列的前面插入foo()
来实现这一点。当JS执行的当前线程完成时,node.js引擎将从事件队列中拉出下一个事件并运行它。这将使您获得输出:
bar
foo
因为console.log('bar')
是当前执行线程的一部分,所以它将在事件循环中的下一个事件被服务之前完成。
所以,用语言来说,code1
示例正在做什么:
foo
函数(这实际上是由解析器在执行任何操作之前完成的)process.nextTick(foo)
,通过在事件队列中插入事件,在此Javascript线程的其余部分完成后调度foo()
。将来要运行的所有回调或函数都以这种方式在node.js中进行调度(通过事件队列)。 node.js是一个事件驱动的环境。console.log('bar')
。foo()
来电的process.nextTick()
来电。foo()
运行。在code2
示例中,这只是顺序执行。根本没有在事件队列中插入任何内容。执行foo()
,然后当该函数返回时,执行console.log('bar')
。
所以process.nextTick()
用于显式安排在JS执行的当前线程完成之后运行的东西。
它与setTimeout()
类似,但process.nextTick()
在当前执行线程后尽快运行,而setTimeout()
可以设置为特定的时间延迟。
您的代码示例似乎来自本文:Understanding process.nextTick()。该文章中有更多解释。
另一个参考:What are the proper use cases for process.nextTick in Node.js?