Skip to content

Comprendere process.nextTick()

Mentre si cerca di comprendere il loop degli eventi di Node.js, una parte importante di esso è process.nextTick(). Ogni volta che il loop degli eventi compie un ciclo completo, lo chiamiamo un tick.

Quando passiamo una funzione a process.nextTick(), istruiamo il motore a invocare questa funzione alla fine dell'operazione corrente, prima che inizi il successivo tick del loop degli eventi:

js
process.nextTick(() => {
  // fai qualcosa
})

Il loop degli eventi è occupato a elaborare il codice della funzione corrente. Quando questa operazione termina, il motore JS esegue tutte le funzioni passate alle chiamate nextTick durante quell'operazione.

È il modo in cui possiamo dire al motore JS di elaborare una funzione in modo asincrono (dopo la funzione corrente), ma il più presto possibile, senza metterla in coda.

Chiamare setTimeout(() => {}, 0) eseguirà la funzione alla fine del prossimo tick, molto più tardi rispetto all'utilizzo di nextTick(), che dà priorità alla chiamata e la esegue appena prima dell'inizio del prossimo tick.

Utilizzare nextTick() quando si desidera assicurarsi che nell'iterazione successiva del loop degli eventi il codice sia già stato eseguito.

Un esempio dell'ordine degli eventi:

js
console.log('Hello => numero 1')
setImmediate(() => {
  console.log('In esecuzione prima del timeout => numero 3')
})
setTimeout(() => {
  console.log('Il timeout in esecuzione per ultimo => numero 4')
}, 0)
process.nextTick(() => {
  console.log('In esecuzione al prossimo tick => numero 2')
})

Esempio di output:

bash
Hello => numero 1
In esecuzione al prossimo tick => numero 2
In esecuzione prima del timeout => numero 3
Il timeout in esecuzione per ultimo => numero 4

L'output esatto potrebbe differire da un'esecuzione all'altra.