首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Node.js中使用process.nextTick的正确用例是什么?

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

Stack Overflow用户
提问于 2011-11-14 00:25:56
回答 2查看 16.3K关注 0票数 60

我见过process.nextTick在一些地方使用,不太清楚它是用来做什么的。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-14 00:36:08

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

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

示例:

代码语言:javascript
复制
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');
};

使用此构造函数的示例中间件

代码语言:javascript
复制
function(req, res, next) {
  var c = new MyConstructor(...);
  c.on('data', function(data) {
    console.log(data);
  });
  c.on('end', next);
}
票数 72
EN

Stack Overflow用户

发布于 2011-11-14 01:15:47

它只是在下一次I/O回调之前在当前操作结束时运行您的函数。Per documentation你可以使用它在调用者同步代码执行后运行你的代码,如果你能用它让你的API/库用户有机会注册需要尽快发出的事件处理程序。另一个用例是确保您始终使用异步调用回调,以便在不同情况下具有一致的行为。

在过去,process.nextTick会被用来为I/O事件的执行提供机会,然而,这不再是这种行为,setImmediate是为这种行为而创建的。我解释了一个use case in the answer of this question

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8112914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档