setImmediate frente a nextTick
La versión 0.10 de Node.js se lanzó hoy y se presentó setImmediate
. La documentación de cambios de API sugiere usarla al realizar nextTick
llamadas recursivas.
Por lo que dice MDN parece muy similar a process.nextTick
.
¿Cuándo debo usar nextTick
y cuándo debo usar setImmediate
?
Úselo setImmediate
si desea poner en cola la función detrás de cualquier devolución de llamada de evento de E/S que ya esté en la cola de eventos. Úselo process.nextTick
para poner en cola de manera efectiva la función al principio de la cola de eventos para que se ejecute inmediatamente después de que se complete la función actual.
Entonces, en un caso en el que intentas dividir un trabajo de larga ejecución vinculado a la CPU mediante recursividad, ahora querrás usar setImmediate
en lugar de process.nextTick
poner en cola la siguiente iteración, ya que de lo contrario las devoluciones de llamadas de eventos de E/S no tendrían la oportunidad. para ejecutar entre iteraciones.
Como una ilustracion:
import fs from 'fs';
import http from 'http';
const options = {
host: 'www.stackoverflow.com',
port: 80,
path: '/index.html'
};
describe('deferredExecution', () => {
it('deferredExecution', (done) => {
console.log('Start');
setTimeout(() => console.log('setTimeout 1'), 0);
setImmediate(() => console.log('setImmediate 1'));
process.nextTick(() => console.log('nextTick 1'));
setImmediate(() => console.log('setImmediate 2'));
process.nextTick(() => console.log('nextTick 2'));
http.get(options, () => console.log('network IO'));
fs.readdir(process.cwd(), () => console.log('file system IO 1'));
setImmediate(() => console.log('setImmediate 3'));
process.nextTick(() => console.log('nextTick 3'));
setImmediate(() => console.log('setImmediate 4'));
fs.readdir(process.cwd(), () => console.log('file system IO 2'));
console.log('End');
setTimeout(done, 1500);
});
});
dará el siguiente resultado
Start // synchronous
End // synchronous
nextTick 1 // microtask
nextTick 2 // microtask
nextTick 3 // microtask
setTimeout 1 // macrotask
file system IO 1 // macrotask
file system IO 2 // macrotask
setImmediate 1 // macrotask
setImmediate 2 // macrotask
setImmediate 3 // macrotask
setImmediate 4 // macrotask
network IO // macrotask
Espero que esto pueda ayudar a comprender la diferencia.
Actualizado:
Las devoluciones de llamada se posponen con
process.nextTick()
run antes de que se active cualquier otro evento de E/S, mientras que con setImmediate(), la ejecución se pone en cola detrás de cualquier evento de E/S que ya esté en la cola.Node.js Design Patterns , de Mario Casciaro (probablemente el mejor libro sobre node.js/js)