2011-11-13 10 views
54

He visto process.nextTick usado en algunos lugares y no puedo decir para qué se usa.¿Cuáles son los casos de uso adecuados para process.nextTick en Node.js?

¿Cuáles son los principales/adecuada los casos de uso de process.nextTick en Node.js? Los documentos básicamente dicen que es una forma más optimizada de hacer setTimeout, pero eso no ayuda mucho.

Solía ​​hacer mucho ActionScript, por lo que la idea de "esperar hasta el siguiente fotograma" para ejecutar el código tiene sentido en cierto nivel: si está ejecutando una animación puede actualizar cada fotograma en lugar de cada milisegundo por ejemplo. También tiene sentido cuando quiere coordinar la configuración de un conjunto de variables: cambia las variables en el cuadro 1 y aplica los cambios en el cuadro 2. Flex implementó algo así en el ciclo de vida de sus componentes.

Mi pregunta es, ¿para qué debería estar usando esto en el lado del servidor JavaScript? No veo ningún lugar desde el primer momento en el que necesites este tipo de control de rendimiento/flujo afinado. Solo buscando un punto en la dirección correcta.

+2

Howtonode tiene un [excelente artículo sobre la comprensión de 'process.nextTick()'] (http://howtonode.org/understanding-process-next-tick) –

Respuesta

67

process.nextTick coloca una devolución de llamada en una cola. Cada devolución de llamada en esta cola se ejecutará al comienzo del siguiente tic del bucle de evento. Básicamente se utiliza como una forma de borrar tu pila de llamadas. Cuando la documentación dice que es como setTimeout, significa decir que es como usar setTimeout(function() { ... }, 1) en el navegador. Tiene los mismos casos de uso.

Un caso de uso de ejemplo sería, usted crea un constructor para algún objeto que necesita eventos vinculados a él. Sin embargo, no puede comenzar a emitir eventos de inmediato, ya que el código que lo creó no ha tenido tiempo de vincularse a eventos todavía. Su llamada de constructor está por encima de ellos en la pila de llamadas, y si continúa haciendo cosas sincrónicas, se mantendrá de esa manera. En este caso, puede usar process.nextTick antes de proceder a lo que sea que estaba a punto de hacer. Garantiza que la persona que use su constructor tenga tiempo suficiente para enlazar eventos.

Ejemplo:

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

Ejemplo Middleware usar este constructor

function(req, res, next) { 
    var c = new MyConstructor(...); 
    c.on('data', function(data) { 
    console.log(data); 
    }); 
    c.on('end', next); 
} 
+0

Gracias, hombre, esto dejó en claro. –

+1

Además, setTimeout es demasiado lento. – Parris

+3

"Cada devolución de llamada en esta cola se ejecutará al comienzo del próximo tic del bucle de evento". Creo que esto ya no es del todo exacto. Según lo entiendo, la cola se procesa al final de la marca actual. "En v0.10, los manejadores nextTick se ejecutan justo después de cada llamada de C++ a JavaScript. Eso significa que, si su código JavaScript llama a process.nextTick, la devolución de llamada se activará tan pronto como el código se complete, pero antes de volver al ciclo de eventos ". - del [Anuncio del nodo 0.10.0] (http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/) –

15

Simplemente pone su función al final del bucle de eventos. Por lo general, cuando realiza un procesamiento síncrono pesado, es mejor utilizar process.nextTick para cada fragmento de código, para asegurarse de que el proceso no bloquee otros eventos. Cuando lo hace, una vez que llega a proess.nextTick y la función finaliza, procesa otros eventos, como las solicitudes http, luego llega a call.nextTick callback y lo ejecuta.

¡Aparte de eso, si puede usarlo para ejecutar una función recursivamente, sin que la pila de llamadas se desborde!

Editar: En este momento hay node's setImmediate function que programa la función que se ejecutará después de los eventos de E/S pendientes (como el manejo de nuevas solicitudes web): expliqué un use case in the answer of this question.

Cuestiones relacionadas