Menu
CoddyTech

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 timer

Un 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.

challenge icon

Desafío

Fácil

Node 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.

  1. Deja console.log('1 sync') tal como está. El código normal se ejecuta primero.
  2. Envuelve la línea 2 microtask en queueMicrotask, para que se ejecute justo después del código normal.
  3. Envuelve la línea 3 timeout y la línea 4 timeout later, cada una en su propio setTimeout. setTimeout(fn, ms) ejecuta la función fn una vez, ms milisegundos 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 later

Prué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');
quiz iconPonte a prueba

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