我从人们那里获得的印象是......除非与process.nextTick一起使用,否则所有JavaScript函数都是同步的。何时是使用它的最佳时机?
我想确保不要在我不需要它的地方过度使用它。在这一点上,我想在数据库调用之前使用它,但同时,据我所知,这些调用默认是异步的,因为整个“异步IO”事情。
只有在JavaScript边界内进行一些密集工作时才能使用它们吗?像解析XML等?
是的,已经有一个问题like this,但似乎已经死了所以我再提出了一个问题。答案 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
调用者。