Каковы правильные варианты использования для process.nextTick в Node.js? - PullRequest
56 голосов
/ 13 ноября 2011

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

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

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

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

Ответы [ 2 ]

69 голосов
/ 13 ноября 2011

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');
};

Пример Middleware с использованием этого конструктора

function(req, res, next) {
  var c = new MyConstructor(...);
  c.on('data', function(data) {
    console.log(data);
  });
  c.on('end', next);
}
15 голосов
/ 13 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...