Menu
CoddyTech

Il ciclo degli eventi

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 26 di 33.

Le callback e le promise vengono eseguite più tardi, e i bug si nascondono nel non sapere esattamente quando.

Node esegue prima tutto il codice sincrono fino alla fine. Poi esegue i microtask: i callback delle promise e le funzioni passate a queueMicrotask. Solo dopo arrivano i timer. setTimeout(fn, ms) esegue fn una volta, dopo ms millisecondi. Anche setTimeout(fn, 0) aspetta che i microtask siano terminati.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

Un ritardo di 0 significa il prima possibile dopo i microtask, mai prima di essi. I timer scattano in base alla durata del ritardo; a parità di ritardo, scatta prima il timer impostato per primo.

challenge icon

Sfida

Facile

Node esegue il tuo codice in un ordine fisso. Prima le righe normali, poi le microattività come i callback delle promise, poi i timer. Usa quest’ordine per far stampare quattro righe in ordine numerico senza spostarle.

order.js stampa le sue quattro righe da 4 a 1. Non spostare né riordinare le righe. Invece, racchiudine tre in modo che vengano eseguite più tardi.

  1. Lascia console.log('1 sync') così com’è. Il codice normale viene eseguito per primo.
  2. Racchiudi la riga 2 microtask in queueMicrotask, così verrà eseguita subito dopo il codice normale.
  3. Racchiudi la riga 3 timeout e la riga 4 timeout later ciascuna nella propria setTimeout. setTimeout(fn, ms) esegue la funzione fn una volta, dopo ms millisecondi. La riga 4 viene impostata prima della riga 3, quindi ha bisogno di un ritardo più lungo.

node order.js stampa quindi:

1 sync
2 microtask
3 timeout
4 timeout later

Prova: prima di eseguirlo, prova a indovinare l’ordine. Poi premi «Gioca»; il terminale mostra $ node order.js. Poi assegna a entrambi i timer un ritardo di 0 ed esegui di nuovo: 4 timeout later ora viene stampato prima di 3 timeout, perché quando i ritardi sono uguali, il timer impostato per primo viene eseguito per primo. Ripristina il ritardo più lungo sulla riga 4 prima di premere «Verifica».

Provalo tu

// Fai in modo che queste righe vengano stampate in ordine numerico senza spostarle.
// Racchiudile invece in queueMicrotask e setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express