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

我已经看到在一些地方使用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

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

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

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

process.nextTick将callback放入队列中。 这个队列中的每个callback将在事件循环的下一个节拍开始时执行。 它基本上被用来清除你的调用栈。 当文档说它像setTimeout ,这意味着它就像在浏览器中使用setTimeout(function() { ... }, 1) 。 它有相同的用例。

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

它只是把你的函数放在事件循环的最后。 通常当你进行一些繁重的同步处理时,最好使用process.nextTick来处理每个代码块,以确保进程不会阻塞其他事件。 当你这样做的时候,到了proess.nextTick和函数结束之后,它会处理其他事件,比如http请求,然后到达process.nextTickcallback并执行它。

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

编辑:现在有节点的setImmediate函数调度待处理的I / O事件(如处理新的Web请求)后运行的函数:我解释了这个问题的答案用例 。