Node的新手,如何理解process.nextTick()

时间:2016-09-06 02:36:46

标签: node.js

代码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

为什么?

我的问题是:

  1. 如何理解“process.nextTick()实际执行的操作是将操作的执行推迟到事件循环的下一次传递”
  2. 实际上,我不知道'event'的概念,console.log('bar')是一个事件? foo()是一个事件? process.nextTick(foo)是一个事件吗?
  3. 谢谢你们。

1 个答案:

答案 0 :(得分:2)

当前JS执行线程完成后,将调用

process.nextTick(foo)调度foo()。它通过在事件队列的前面插入foo()来实现这一点。当JS执行的当前线程完成时,node.js引擎将从事件队列中拉出下一个事件并运行它。这将使您获得输出:

bar
foo

因为console.log('bar')是当前执行线程的一部分,所以它将在事件循环中的下一个事件被服务之前完成。

所以,用语言来说,code1示例正在做什么:

  1. 定义foo函数(这实际上是由解析器在执行任何操作之前完成的)
  2. 运行process.nextTick(foo),通过在事件队列中插入事件,在此Javascript线程的其余部分完成后调度foo()。将来要运行的所有回调或函数都以这种方式在node.js中进行调度(通过事件队列)。 node.js是一个事件驱动的环境。
  3. 运行console.log('bar')
  4. JS的当前线程完成执行。
  5. 系统从事件队列中提取下一个事件并运行它。
  6. 下一个事件是来自foo()来电的process.nextTick()来电。
  7. foo()运行。
  8. 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?