一尘不染

Node.js中process.nextTick的正确用例是什么?

node.js

我已经process.nextTick在一些地方看到过使用它,还不能完全知道它的用途。

process.nextTickNode.js 的主要/正确用例是什么?文档基本上说这是一种更优化的方法setTimeout,但这并没有太大帮助。

我曾经做过很多ActionScript,所以“等到下一帧”执行代码的想法在某种程度上是有意义的-
如果正在运行动画,则可以让它每帧更新一次,而不是每毫秒更新一次。当您要协调设置一系列变量时,这也很有意义-
在第1帧中更改变量,并在第2帧中应用更改。Flex在其组件生命周期中实现了类似的操作。

我的问题是,我应该在服务器端JavaScript中使用它吗?我看不到任何需要这种经过微调的性能/流控制的地方。只是寻找正确方向的一点。


阅读 217

收藏
2020-07-07

共1个答案

一尘不染

process.nextTick将回调放入队列。此队列中的每个回调将在事件循环的下一个滴答的开始处执行。基本上,它用作清除调用堆栈的一种方法。当文档说像时setTimeout,意味着说像setTimeout(function() { ... }, 1)在浏览器中使用。它具有相同的用例。

一个示例用例是,为需要绑定事件的某些对象创建一个构造函数。但是,您无法立即开始发出事件,因为实例化它的代码还没有时间绑定到事件。您的构造函数调用在调用堆栈中位于它们之上,并且如果您继续执行同步操作,它将保持这种状态。在这种情况下,您可以process.nextTick在继续进行任何操作之前使用“
a” 。它保证使用您的构造函数的人将有足够的时间绑定事件。

例:

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);
}
2020-07-07