setImmediate frente a nextTick

Resuelto Benjamin Gruenbaum asked hace 11 años • 8 respuestas

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 nextTickllamadas recursivas.

Por lo que dice MDN parece muy similar a process.nextTick.

¿Cuándo debo usar nextTicky cuándo debo usar setImmediate?

Benjamin Gruenbaum avatar Mar 12 '13 05:03 Benjamin Gruenbaum
Aceptado

Úselo setImmediatesi 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.nextTickpara 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 setImmediateen lugar de process.nextTickponer 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.

JohnnyHK avatar Mar 11 '2013 22:03 JohnnyHK

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)

DraganS avatar Feb 03 '2017 18:02 DraganS