Skip to content

setImmediate()

setImmediate est une fonction globale de Node.js qui permet de différer l'exécution d'une fonction jusqu'à ce que la prochaine itération de l'Event Loop commence. Bien que cela ressemble à setTimeout avec un délai de 0, il y a des différences clés dans la façon dont ils sont traités par l'Event Loop.

Fonctionnement de setImmediate :

Lorsque vous appelez setImmediate(callback), le callback est placé dans la file d'attente "immediate" de l'Event Loop. À la fin de la phase en cours de l'Event Loop, Node.js commencera à exécuter tous les callbacks dans cette file d'attente jusqu'à ce qu'ils soient tous traités, avant de passer à la phase suivante de l'Event Loop.

Différence entre setImmediate et setTimeout(callback, 0) :

Bien qu'ils puissent sembler similaires, ils ne le sont pas en raison de la manière dont l'Event Loop traite les différentes files d'attente :

  • setTimeout(callback, 0) : Place le callback dans la file d'attente des timers. Après l'expiration du temps (dans ce cas, 0ms), le callback sera transféré à la file d'attente des callbacks pour être exécuté. Cela signifie qu'il doit attendre l'exécution d'autres tâches prévues avant lui, même si le délai est de 0ms.

  • setImmediate(callback) : Place directement le callback dans la file d'attente "immediate", qui est traitée juste après la phase actuelle de l'Event Loop, et avant n'importe quel setTimeout.

Dans la pratique, cela signifie que setImmediate est souvent exécuté avant setTimeout(callback, 0), bien que ce ne soit pas garanti car d'autres types d'événements peuvent intervenir.

Exemple :

javascript
console.log('Début');

setImmediate(() => {
    console.log('setImmediate');
});

setTimeout(() => {
    console.log('setTimeout');
}, 0);

console.log('Fin');
console.log('Début');

setImmediate(() => {
    console.log('setImmediate');
});

setTimeout(() => {
    console.log('setTimeout');
}, 0);

console.log('Fin');

Une sortie possible (et courante) serait :

Début
Fin
setImmediate
setTimeout
Début
Fin
setImmediate
setTimeout

Cependant, notez que la sortie exacte peut varier en fonction de l'environnement d'exécution et d'autres facteurs, car l'ordre d'exécution entre setImmediate et setTimeout(callback, 0) n'est pas strictement garanti.

À retenir :

  • Utilisez setImmediate lorsque vous voulez différer une action jusqu'à la prochaine itération de l'Event Loop, sans un délai spécifique.
  • Utilisez setTimeout si vous voulez différer une action pour une période de temps spécifique.