El bucle de eventos
Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 26 de 33.
Las devoluciones de llamada y las promesas se ejecutan más tarde, y los errores se ocultan cuando no se sabe exactamente cuándo.
Node ejecuta primero todo el código síncrono hasta el final. Después ejecuta las microtareas: las devoluciones de llamada de las promesas y las funciones pasadas a queueMicrotask. Solo entonces se ejecutan los temporizadores. setTimeout(fn, ms) ejecuta fn una vez, después de ms milisegundos. Incluso setTimeout(fn, 0) espera hasta que se completen las microtareas.
setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timerUn retraso de 0 significa que se ejecuta lo antes posible después de las microtareas, nunca antes. Los temporizadores se activan en orden según su retraso; si los retrasos son iguales, se activa primero el temporizador configurado primero.
Desafío
FácilNode ejecuta tu código en un orden fijo. Primero las líneas normales, después las microtareas, como las devoluciones de llamada de las promesas, y luego los temporizadores. Usa ese orden para hacer que se impriman cuatro líneas en orden numérico sin moverlas.
order.js imprime sus cuatro líneas del 4 al 1. No muevas ni reordenes las líneas. En su lugar, envuelve tres de ellas para que se ejecuten más tarde.
- Deja
console.log('1 sync')tal como está. El código normal se ejecuta primero. - Envuelve la línea
2 microtaskenqueueMicrotask, para que se ejecute justo después del código normal. - Envuelve la línea
3 timeouty la línea4 timeout later, cada una en su propiosetTimeout.setTimeout(fn, ms)ejecuta la funciónfnuna vez,msmilisegundos después. La línea 4 se establece antes que la línea 3, así que necesita un retraso más largo.
node order.js imprime después:
1 sync
2 microtask
3 timeout
4 timeout laterPruébalo: antes de ejecutarlo, adivina el orden. Después, pulsa Run; el terminal muestra $ node order.js. Luego, asigna un retraso de 0 a ambos temporizadores y vuelve a ejecutarlo: ahora 4 timeout later se imprime antes que 3 timeout, porque cuando los retrasos son iguales, el temporizador que se establece primero se ejecuta primero. Vuelve a poner el retraso más largo en la línea 4 antes de pulsar «Comprobar».
Pruébalo tú mismo
// Haz que estas líneas se impriman en orden numérico sin moverlas.
// En su lugar, envuélvelas en queueMicrotask y setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Conceptos básicos de Node.js
Practica por tu cuenta: Playground de Express