Appearance
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 lecallbackdans la file d'attente des timers. Après l'expiration du temps (dans ce cas,0ms), lecallbacksera 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 de0ms.setImmediate(callback): Place directement lecallbackdans la file d'attente "immediate", qui est traitée juste après la phase actuelle de l'Event Loop, et avant n'importe quelsetTimeout.
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
setTimeoutDébut
Fin
setImmediate
setTimeoutCependant, 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
setImmediatelorsque vous voulez différer une action jusqu'à la prochaine itération de l'Event Loop, sans un délai spécifique. - Utilisez
setTimeoutsi vous voulez différer une action pour une période de temps spécifique.