Il y a deux types (les plus utilisés) de fonction timer en javascript setTimeout
y setInterval
( autre )
Ces deux méthodes ont la même signature. Elles prennent une fonction de rappel et un délai comme paramètre.
setTimeout
ne s'exécute qu'une seule fois après le délai alors que setInterval
continue à appeler la fonction de rappel après chaque milisec de délai.
Ces deux méthodes renvoient un identifiant entier qui peut être utilisé pour les effacer avant l'expiration de la minuterie.
clearTimeout
y clearInterval
Ces deux méthodes prennent un identifiant entier retourné par les fonctions ci-dessus. setTimeout
y setInterval
Exemple :
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Si vous exécutez le code ci-dessus, vous verrez qu'il alerte before setTimeout
et ensuite after setTimeout
enfin il alerte I am setTimeout
après 1sec (1000ms)
Ce que l'on peut remarquer dans l'exemple, c'est que l'option setTimeout(...)
est asynchrone, ce qui signifie qu'elle n'attend pas que le délai soit écoulé pour passer à l'instruction suivante, c'est à dire alert("after setTimeout");
Exemple :
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Si vous exécutez le code ci-dessus, vous verrez qu'il alerte before setInterval
et ensuite after setInterval
enfin il alerte I am setInterval
5 fois après 1sec (1000ms) parce que le setTimeout efface la minuterie après 5 secondes, sinon vous recevrez une alerte toutes les 1 seconde. I am setInterval
Infiniment.
Comment le navigateur fait-il cela en interne ?
Je vais vous expliquer en quelques mots.
Pour comprendre cela, vous devez connaître la file d'attente des événements en javascript. Il existe une file d'attente d'événements implémentée dans le navigateur. Chaque fois qu'un événement est déclenché en javascript, tous ces événements (comme un clic, etc.) sont ajoutés à cette file. Lorsque votre navigateur n'a rien à exécuter, il prend un événement de la file d'attente et les exécute un par un.
Maintenant, quand vous appelez setTimeout
o setInterval
votre callback est enregistré dans un timer dans le navigateur et il est ajouté à la file d'attente des événements après l'expiration du temps donné et finalement javascript prend l'événement de la file d'attente et l'exécute.
Il en est ainsi parce que les moteurs javascript sont monofilaires et ne peuvent exécuter qu'une seule chose à la fois. Donc, ils ne peuvent pas exécuter d'autres javascript et garder la trace de votre timer. C'est pourquoi ces timers sont enregistrés avec le navigateur (le navigateur n'est pas un thread unique) et il peut garder la trace du timer et ajouter un événement dans la file d'attente après l'expiration du timer.
Il en va de même pour setInterval
seulement dans ce cas, l'événement est ajouté à la file d'attente encore et encore après l'intervalle spécifié jusqu'à ce qu'il soit effacé ou que la page du navigateur soit rafraîchie.
Note
Le paramètre de délai que vous passez à ces fonctions est le délai minimum. minimum pour exécuter le callback. En effet, après l'expiration du délai le navigateur ajoute l'événement à la file d'attente pour être exécuté par le moteur moteur javascript mais l'exécution de la callback dépend de la position de l'événement dans la file d'attente. position de l'événement dans la file d'attente et comme le moteur est mono-threadé, il exécutera tous les événements dans la file d'attente un par un.
Par conséquent, votre callback peut parfois prendre plus de temps que le délai spécifié pour être appelé, en particulier lorsque votre autre code bloque le thread et ne lui donne pas le temps de traiter ce qui est dans la file d'attente.
Et comme je l'ai mentionné, javascript est à fil unique. Donc, si vous bloquez le fil pendant longtemps.
Comme ce code
while(true) { //infinite loop
}
Votre utilisateur peut recevoir un message disant La page ne répond pas .