我看过process.nextTick
在一些地方使用过,并不能完全说出它的用途。
Node.js中process.nextTick
的主要/正确用例是什么?文档基本上说它是一种更优化的setTimeout
方式,但这没有多大帮助。
我曾经做过很多ActionScript,所以“等到下一帧”执行代码的想法在某种程度上是有意义的 - 如果你正在运行动画,你可以让它每帧都更新而不是每毫秒例如。当您想要协调设置一堆变量时,它也是有意义的 - 您可以更改第1帧中的变量,并在第2帧中应用更改.Flex在其组件生命周期中实现了类似的功能。
我的问题是,我应该在服务器端JavaScript中使用它?我没有看到任何地方,你需要这种微调的性能/流量控制。只是朝着正确的方向寻找一个点。
答案 0 :(得分:69)
process.nextTick
将回调放入队列中。此队列中的每个回调都将在事件循环的下一个滴答开始时执行。它基本上用作清除调用堆栈的方法。当文档说它像setTimeout
时,就意味着它就像在浏览器中使用setTimeout(function() { ... }, 1)
一样。它具有相同的用例。
一个示例用例是,您需要为某个对象创建一个构造函数,该对象需要绑定到它的事件。但是,您无法立即开始发送事件,因为实例化它的代码还没有时间绑定到事件。您的构造函数调用在调用堆栈中位于它们之上,如果您继续执行同步操作,它将保持这种状态。在这种情况下,您可以在继续执行任何操作之前使用process.nextTick
。它保证使用构造函数的人有足够的时间来绑定事件。
示例:
var MyConstructor = function() {
...
process.nextTick(function() {
self._continue();
});
};
MyConstructor.prototype.__proto__ = EventEmitter.prototype;
MyConstructor.prototype._continue = function() {
// without the process.nextTick
// these events would be emitted immediately
// with no listeners. they would be lost.
this.emit('data', 'hello');
this.emit('data', 'world');
this.emit('end');
};
使用此构造函数的中间件示例
function(req, res, next) {
var c = new MyConstructor(...);
c.on('data', function(data) {
console.log(data);
});
c.on('end', next);
}
答案 1 :(得分:15)
它只是将您的函数放在事件循环的末尾。通常,当您进行一些繁重的同步处理时,最好对每个代码块使用process.nextTick,以确保该进程不会阻止其他事件。当你这样做,在它到达proess.nextTick和函数结束后,它处理其他事件,如http请求,然后它到达process.nextTick回调并执行它。
除此之外,如果你可以使用它来递归地运行一个函数,而不会让调用堆栈溢出!
编辑:现在有node's setImmediate function计划在挂起的I / O事件之后运行的函数(比如处理新的Web请求):我解释了use case in the answer of this question。