Skip to content

Découvrir les temporisateurs JavaScript

setTimeout()

Lors de l'écriture de code JavaScript, vous pourriez vouloir retarder l'exécution d'une fonction.

C'est le rôle de setTimeout. Vous spécifiez une fonction de rappel à exécuter plus tard, et une valeur exprimant à quel moment vous voulez qu'elle s'exécute, en millisecondes :

js
setTimeout(() => {
  // s'exécute après 2 secondes
}, 2000)
setTimeout(() => {
  // s'exécute après 50 millisecondes
}, 50)

Cette syntaxe définit une nouvelle fonction. Vous pouvez appeler n'importe quelle autre fonction que vous voulez, ou vous pouvez passer un nom de fonction existant, et un ensemble de paramètres :

js
const myFunction = (firstParam, secondParam) => {
  // faire quelque chose
}
// s'exécute après 2 secondes
setTimeout(myFunction, 2000, firstParam, secondParam)

setTimeout retourne l'ID du temporisateur. Ceci n'est généralement pas utilisé, mais vous pouvez stocker cet ID, et l'effacer si vous voulez supprimer cette exécution de fonction planifiée :

js
const id = setTimeout(() => {
  // devrait s'exécuter après 2 secondes
}, 2000)
// J'ai changé d'avis
clearTimeout(id)

Délai nul

Si vous spécifiez un délai d'attente de 0, la fonction de rappel sera exécutée dès que possible, mais après l'exécution de la fonction actuelle :

js
setTimeout(() => {
  console.log('après ')
}, 0)
console.log(' avant ')

Ce code affichera

bash
avant
après

Ceci est particulièrement utile pour éviter de bloquer le processeur sur des tâches intensives et laisser d'autres fonctions s'exécuter lors d'un calcul lourd, en mettant les fonctions en file d'attente dans le planificateur.

TIP

Certains navigateurs (IE et Edge) implémentent une méthode setImmediate() qui fait exactement la même chose, mais ce n'est pas standard et indisponible sur d'autres navigateurs. Mais c'est une fonction standard dans Node.js.

setInterval()

setInterval est une fonction similaire à setTimeout, avec une différence : au lieu d'exécuter la fonction de rappel une seule fois, elle l'exécutera indéfiniment, à l'intervalle de temps spécifié (en millisecondes) :

js
setInterval(() => {
  // s'exécute toutes les 2 secondes
}, 2000)

La fonction ci-dessus s'exécute toutes les 2 secondes à moins que vous ne lui disiez de s'arrêter, en utilisant clearInterval, en lui passant l'ID d'intervalle que setInterval a retourné :

js
const id = setInterval(() => {
  // s'exécute toutes les 2 secondes
}, 2000)
// J'ai changé d'avis
clearInterval(id)

Il est courant d'appeler clearInterval à l'intérieur de la fonction de rappel setInterval, pour lui permettre de déterminer automatiquement si elle doit s'exécuter à nouveau ou s'arrêter. Par exemple, ce code exécute quelque chose à moins que App.somethingIWait n'ait la valeur arrivée :

setTimeout récursif

setInterval démarre une fonction toutes les n millisecondes, sans tenir compte du moment où une fonction a terminé son exécution.

Si une fonction prend toujours le même temps, tout va bien.

Peut-être que la fonction prend des temps d'exécution différents, en fonction des conditions du réseau.

Et peut-être qu'une longue exécution chevauche la suivante.

Pour éviter cela, vous pouvez planifier un setTimeout récursif à appeler lorsque la fonction de rappel se termine :

js
const myFunction = () => {
  // faire quelque chose
  setTimeout(myFunction, 1000)
}
setTimeout(myFunction, 1000)

setTimeout et setInterval sont disponibles dans Node.js, via le module Timers.

Node.js fournit également setImmediate(), qui équivaut à utiliser setTimeout(() => {}, 0), principalement utilisé pour travailler avec la boucle d'événements Node.js.