当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Node.js中process.nextTick的正确用例是什么?》经验,为你挑选了2个好方法。

我见过process.nextTick在一些地方使用过,并不能完全说出它的用途.

https://github.com/andrewvc/node-paperboy/blob/master/lib/paperboy.js#L24

https://github.com/substack/node-browserify/blob/master/index.js#L95

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

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

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



1> chjj..:

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

一个示例用例是,您为某些需要绑定到它的事件的对象创建构造函数.但是,您无法立即开始发送事件,因为实例化它的代码还没有时间绑定到事件.您的构造函数调用在调用堆栈中位于它们之上,如果您继续执行同步操作,它将保持这种状态.在这种情况下,你可以使用a 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);
}


"此队列中的每个回调都将在事件循环的下一个滴答开始时执行." 我认为这不再是完全准确的了.据我了解,队列在当前刻度结束时处理."在v0.10中,nextTick处理程序在每次从C++调用到JavaScript之后立即运行.这意味着,如果你的JavaScript代码调用process.nextTick,那么一旦代码运行完成,回调就会激活,但在返回之前到事件循环." - 来自[Node 0.10.0公告](http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/)
另外,setTimeout太慢了.

2> Farid Nouri ..:

它只是将您的函数放在事件循环的末尾.通常,当您进行一些繁重的同步处理时,最好对每个代码块使用process.nextTick,以确保该进程不会阻止其他事件.当你这样做,在它到达proess.nextTick和函数结束后,它处理其他事件,如http请求,然后它到达process.nextTick回调并执行它.

除此之外,如果你可以使用它来递归地运行一个函数,而不会让调用堆栈溢出!

编辑:现在有节点的setImmediate函数,它调度在挂起的I/O事件之后运行的函数(比如处理新的Web请求):我在这个问题的答案中解释了一个用例.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有