什么时候是使用process.nextTick的最佳时机?

时间:2016-10-24 07:47:50

标签: javascript node.js asynchronous

我从人们那里获得的印象是......除非与process.nextTick一起使用,否则所有JavaScript函数都是同步的。何时是使用它的最佳时机?

我想确保不要在我不需要它的地方过度使用它。在这一点上,我想在数据库调用之前使用它,但同时,据我所知,这些调用默认是异步的,因为整个“异步IO”事情。

只有在JavaScript边界内进行一些密集工作时才能使用它们吗?像解析XML等?

是的,已经有一个问题like this,但似乎已经死了所以我再提出了一个问题。

2 个答案:

答案 0 :(得分:3)

这个答案没有声称完整,但这是我的想法:

我可以想象两个用例。第一个是,确保某些东西真的是异步。这在使用EventEmitter时很方便。想象一下,您希望能够像这样使用发射器的所有方法:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
  aMethod(){
    console.log('some sync stuff');
    this.emit('aMethodResponse');
    return this;
  }
}
var myEmitter = new MyEmitter();
myEmitter.aMethod()
  .once('aMethodResponse', () => console.log('got response'));

这将无法正常工作,因为在建立侦听器之前触发了事件。 process.nextTick()确保不会发生这种情况。

aMethod(){
  console.log('some sync stuff');
  process.nextTick(() => this.emit('aMethodResponse'));
  return this;
}

编辑:删除了第二个建议,因为它完全错误

答案 1 :(得分:3)

  

我想在数据库调用之前使用它,但是,据我所知,这些调用默认是异步的,因为整个“异步IO”事情。

是。数据库驱动程序本身应该本身是异步的,因此您不需要在此处使用process.nextTick来“使其异步”。最耗时的部分是数据库中的IO和计算,所以等待额外的滴答只会减慢实际情况。

  

只有在JavaScript边界内进行一些密集工作时才能使用它们吗?像解析XML等?

是的,确切地说。您可以使用它来阻止大型同步功能阻止您的应用程序。如果你想解析一个XML文件,而不是通过它啃3秒,在此期间没有新的连接可以打开,没有收到任何请求,也没有发送任何响应,你会流式传输文件并每次只解析它的一小部分在使用nextTick并允许其他工作同时完成之前。

但是,请注意解析器应在内部使用nextTick并提供异步API,而不是在调用解析器之前使用nextTick调用者。