Подтвердить что ты не робот

Каковы правильные варианты использования для process.nextTick в Node.js?

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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