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 timerUn 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.
Sfida
FacileNode 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.
- Lascia
console.log('1 sync')così com’è. Il codice normale viene eseguito per primo. - Racchiudi la riga
2 microtaskinqueueMicrotask, così verrà eseguita subito dopo il codice normale. - Racchiudi la riga
3 timeoute la riga4 timeout laterciascuna nella propriasetTimeout.setTimeout(fn, ms)esegue la funzionefnuna volta, dopomsmillisecondi. 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 laterProva: 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');
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