Каковы правильные варианты использования для процесса.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
каковы основные / правильные случаи использования process.nextTick
в узел.Джей? Врачи в основном говорят, что это более оптимизированный способ сделать setTimeout
, но это не очень помогает.
я использовал много ActionScript, поэтому идея "ожидания до следующего кадра" для выполнения кода имеет смысл на некотором уровне - если вы запускаете анимацию, вы можете обновить каждый кадр, а не каждую миллисекунду, например. Это также имеет смысл, когда вы хотите координировать установку группы переменных - вы меняете переменные в кадре 1 и применяете изменения в кадре 2. Flex реализовал что-то подобное в своем компоненте жизненный цикл.
мой вопрос в том, что я должен использовать это для серверного JavaScript? Я не вижу никаких мест с места в карьер, где вам понадобится такая тонкая настройка производительности/управления потоком. Просто ищу точку в правильном направлении.
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 случае использовать в ответе на этот вопрос.