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

标签 javascript performance memory node.js

我看过process.nextTick在一些地方使用过,并不能完全确定它的用途。

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

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

我的问题是,我应该在服务器端 JavaScript 中使用它做什么?我没有看到任何需要这种微调性能/流量控制的地方。只是在正确的方向上寻找一个点。

最佳答案

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

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

例子:

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

关于javascript - Node.js 中 process.nextTick 的正确用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112914/

相关文章:

Python 加载二进制文件导致 1500% 内存开销

javascript - 派生索引数组

javascript - 如何在 Node.js 中使用 redis WATCH?

javascript - jquery 事件(提交时)正在影响我的所有 div,而不是单击按钮的唯一 div?

java - 使用 Java 映射大于 2GB 的文件

CVE-2017-5753 边界检查绕过,又名每个人都在谈论的巨大错误

javascript - 将\n 或\r 更改为 <br/>

java - 为什么java中BitSet的内部数据存储为long[]而不是java中的int[]?

memory - 为什么从 Memory & I\O 获取数据很昂贵?

c - 不同的字符串如何具有相同的地址