Каковы правильные варианты использования для процесса.nextTick в узел.Джей?


Я видел process.nextTick используется в нескольких местах и не может точно сказать, для чего он используется.

каковы основные / правильные случаи использования process.nextTick в узел.Джей? Врачи в основном говорят, что это более оптимизированный способ сделать setTimeout, но это не очень помогает.

я использовал много ActionScript, поэтому идея "ожидания до следующего кадра" для выполнения кода имеет смысл на некотором уровне - если вы запускаете анимацию, вы можете обновить каждый кадр, а не каждую миллисекунду, например. Это также имеет смысл, когда вы хотите координировать установку группы переменных - вы меняете переменные в кадре 1 и применяете изменения в кадре 2. Flex реализовал что-то подобное в своем компоненте жизненный цикл.

мой вопрос в том, что я должен использовать это для серверного JavaScript? Я не вижу никаких мест с места в карьер, где вам понадобится такая тонкая настройка производительности/управления потоком. Просто ищу точку в правильном направлении.

2 56

2 ответа:

process.nextTick ставит звонок в очередь. Каждый обратный звонок в этой очереди будет выполняться в самом начале следующего тика цикла событий. Это в основном используется как способ очистить стек вызовов. Когда документация говорит, что это как setTimeout, это значит, что это похоже на использование setTimeout(function() { ... }, 1) в браузере. Он имеет те же случаи использования.

один пример использования был бы, вы создаете конструктор для некоторого объекта, который нуждается в событиях, привязанных к нему. Однако вы не можете начать излучать события сразу же, потому что код, создающий его, еще не успел привязаться к событиям. Ваш вызов конструктора находится над ними в стеке вызовов, и если вы продолжаете делать синхронные вещи, он останется таким же. В этом случае вы можете использовать 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);
}

Он просто помещает вашу функцию в конце цикла событий. Обычно, когда вы делаете какую-то тяжелую синхронную обработку, лучше использовать процесс.nextTick для каждого куска кода, чтобы убедиться, что процесс не будет блокировать другие события. Когда вы это сделаете, после того, как он достигнет проесса.nextTick и функция заканчивается, он обрабатывает другие события, такие как http-запросы, затем он достигает процесса.nextTick обратный вызов и выполняет его.

кроме этого, если вы можете использовать его для запуска функция рекурсивно, без переполнения стека вызовов!

Edit: прямо сейчас есть функция setImmediate узла этот график-это функция, которая будет выполняться после ожидающих событий ввода-вывода(например, обработка новых веб-запросов): я объяснил a случае использовать в ответе на этот вопрос.