📢 Nuovo Corso Laravel API disponibile!

Comprensione di setImmediate()

Comprendere setImmediate()

Quando vuoi eseguire un pezzo di codice in modo asincrono, ma il prima possibile, una opzione è utilizzare la funzione setImmediate() fornita da Node.js:

setImmediate(() => {
// esegui qualcosa
});

Ogni funzione passata come argomento a setImmediate() è un callback che viene eseguito nella successiva iterazione del ciclo degli eventi.

Come è diverso setImmediate() da setTimeout(() => {}, 0) (impostando un timeout di 0 ms) e da process.nextTick() e Promise.then()?

Una funzione passata a process.nextTick() verrà eseguita nell’iterazione corrente del ciclo degli eventi, dopo che l’operazione corrente è terminata. Ciò significa che verrà sempre eseguita prima di setTimeout e setImmediate.

Un callback setTimeout() con un ritardo di 0 ms è molto simile a setImmediate(). L’ordine di esecuzione dipenderà da vari fattori, ma entrambi verranno eseguiti nella successiva iterazione del ciclo degli eventi.

Un callback di process.nextTick viene aggiunto alla process.nextTick queue. Un callback di Promise.then() viene aggiunto alla promises microtask queue. Un callback di setTimeout, setImmediate viene aggiunto alla macrotask queue.

Il ciclo degli eventi esegue prima i compiti nella process.nextTick queue, quindi esegue la promises microtask queue e infine esegue la macrotask queue.

Ecco un esempio per mostrare l’ordine tra setImmediate(), process.nextTick() e Promise.then():

const baz = () => console.log("baz");
const foo = () => console.log("foo");
const zoo = () => console.log("zoo");
const start = () => {
console.log("start");
setImmediate(baz);
new Promise((resolve, reject) => {
resolve("bar");
}).then((resolve) => {
console.log(resolve);
process.nextTick(zoo);
});
process.nextTick(foo);
};
start();
// start foo bar zoo baz

Questo codice chiamerà prima start(), quindi chiamerà foo() nella process.nextTick queue. Dopo ciò, gestirà la promises microtask queue, che stamperà bar e aggiungerà zoo() nella process.nextTick queue contemporaneamente. Successivamente chiamerà zoo() che è stato appena aggiunto. Alla fine, verrà chiamato baz() nella macrotask queue.