【问题标题】:Newcomer to Node, how to understand process.nextTick()Node新手,如何理解process.nextTick()
【发布时间】:2017-01-13 08:52:26
【问题描述】:

代码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) 是一个事件吗?

谢谢你们。

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    bar
    foo
    

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

    所以,简而言之,这就是code1 示例的作用:

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

    【讨论】:

    • 谢谢。还有一个问题,“在事件队列的最前面插入”,那么Node拉到队列中的事件的末尾? (先进先出)
    • @watchdog - 通常事件队列对于所有相同类型的事件都是先进先出的。但是,setTimeout()、setImmediate() 和 process.nextTick() 每个都有自己的插入事件队列的方式,这决定了它们前面跳转的内容。有文章比较了这三者。 nextTick() 几乎位于事件队列的前面(在其他 I/O 事件之前)。 setImmediate() 跟踪队列中的其他 I/O 事件,setTimeout() 用于安排未来的特定时间,并且总是在队列中的其他所有事件之后。
    • 我明白了。非常感谢
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2016-11-20
    • 1970-01-01
    • 2011-09-03
    • 2012-07-17
    相关资源
    最近更新 更多