Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中process.nextTick的正确用例是什么?_Javascript_Performance_Memory_Node.js - Fatal编程技术网

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

Javascript Node.js中process.nextTick的正确用例是什么?,javascript,performance,memory,node.js,Javascript,Performance,Memory,Node.js,我在一些地方看到过它的用法,但不太清楚它的用途 Node.js中的process.nextTick的主要/正确使用情况是什么?文档基本上说,这是一种更优化的设置超时的方法,但这没有多大帮助 我曾经做过很多动作脚本,所以“等到下一帧”执行代码的想法在某种程度上是有意义的——例如,如果你正在运行一个动画,你可以让它每一帧更新一次,而不是每毫秒更新一次。当您想要协调设置一组变量时,这也是有意义的——您在第1帧中更改变量,并在第2帧中应用更改。Flex在其组件生命周期中实现了类似的功能 我的问题

我在一些地方看到过它的用法,但不太清楚它的用途

Node.js中的
process.nextTick
的主要/正确使用情况是什么?文档基本上说,这是一种更优化的设置超时的方法,但这没有多大帮助

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


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

处理。nextTick
将回调放入队列。此队列中的每个回调都将在事件循环的下一个滴答声开始时执行。它基本上是用来清除调用堆栈的。当文档说它类似于
setTimeout
,这意味着它类似于在浏览器中使用
setTimeout(function(){…},1)
。它有相同的用例

一个示例用例是,为需要绑定事件的某些对象创建构造函数。但是,您不能立即开始发出事件,因为实例化它的代码还没有时间绑定到事件。您的构造函数调用在调用堆栈中位于它们之上,如果您继续执行同步操作,它将保持这种状态。在本例中,您可以在继续执行您将要执行的任何操作之前使用
进程.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.nextTick回调并执行它

除此之外,如果您可以使用它递归地运行函数,而不会导致调用堆栈溢出


编辑:现在有一个计划是在挂起的I/O事件(如处理新的web请求)后运行的函数:我解释了一个。

另外,setTimeout太慢。“此队列中的每个回调都将在事件循环的下一个周期开始时执行。”我认为这不再完全准确。据我所知,队列是在当前滴答声结束时处理的。在V0.10中,NECTETK处理器在每次从C++调用到JavaScript之后运行。这意味着,如果您的JavaScript代码调用Purrest.NeXTICK,那么代码返回到完成时,回调将立即被触发。