Entendiendo process.nextTick()
Al intentar comprender el bucle de eventos de Node.js, una parte importante de este es process.nextTick()
. Cada vez que el bucle de eventos completa un ciclo, lo llamamos un tick.
Cuando pasamos una función a process.nextTick(), instruimos al motor a invocar esta función al final de la operación actual, antes de que comience el siguiente tick del bucle de eventos:
process.nextTick(() => {
// hacer algo
})
El bucle de eventos está ocupado procesando el código de la función actual. Cuando esta operación termina, el motor JS ejecuta todas las funciones pasadas a las llamadas nextTick
durante esa operación.
Es la forma en que podemos decirle al motor JS que procese una función de forma asíncrona (después de la función actual), pero lo antes posible, sin ponerla en cola.
Llamar a setTimeout(() => {}, 0)
ejecutará la función al final del siguiente tick, mucho más tarde que cuando se usa nextTick()
, que prioriza la llamada y la ejecuta justo antes del comienzo del siguiente tick.
Usa nextTick()
cuando quieras asegurarte de que en la siguiente iteración del bucle de eventos ese código ya se haya ejecutado.
Un ejemplo del orden de los eventos:
console.log('Hola => número 1')
setImmediate(() => {
console.log('Ejecutando antes del timeout => número 3')
})
setTimeout(() => {
console.log('El timeout se ejecuta al final => número 4')
}, 0)
process.nextTick(() => {
console.log('Ejecutando en el siguiente tick => número 2')
})
Salida de ejemplo:
Hola => número 1
Ejecutando en el siguiente tick => número 2
Ejecutando antes del timeout => número 3
El timeout se ejecuta al final => número 4
La salida exacta puede diferir de una ejecución a otra.