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

为什么?

我的问题是:
  • 如何理解“process.nextTick()的实际作用是将操作的执行推迟到事件循环的下一次传递之前”
  • 实际上,我不知道'event'的概念,console.log('bar')是一个事件吗? foo()是一个事件吗? process.nextTick(foo)是一个事件吗?

  • 感谢大伙们。

    最佳答案

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

    bar
    foo
    

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

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

    关于node.js - Node的新手,如何理解process.nextTick(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39339831/

    10-09 20:24