Il existe deux types (principalement utilisés) de fonction de minuterie en javascript setTimeout
et setInterval
( autre )
Ces deux méthodes ont la même signature. Ils prennent une fonction de rappel et un temps de retard comme paramètre.
setTimeout
s'exécute une seule fois après le délai alors que setInterval
continue d'appeler la fonction de rappel après chaque délai millisecs.
ces deux méthodes retournent un identificateur entier qui peut être utilisé pour les effacer avant l'expiration du minuteur.
clearTimeout
et clearInterval
ces deux méthodes prennent un identifiant entier renvoyé par les fonctions ci-dessus setTimeout
etsetInterval
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 after setTimeout
enfin il alerte I am setTimeout
après 1sec (1000ms)
Ce que vous pouvez remarquer à partir de l'exemple est que le setTimeout(...)
est asynchrone, ce qui signifie qu'il n'attend pas que le minuteur se soit écoulé avant de passer à l'instruction suivante, c'est-à-direalert("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 after setInterval
enfin il alerte I am setInterval
5 fois après 1sec (1000ms) car le setTimeout efface la minuterie après 5 secondes ou toutes les 1 seconde, vous recevrez une alerte à l' I am setInterval
infini.
Comment le navigateur fait-il cela en interne?
Je vais vous expliquer brièvement.
Pour comprendre que vous devez connaître la file d'attente d'événements en javascript. Une file d'attente d'événements est implémentée dans le navigateur. A chaque fois qu'un événement est déclenché dans js, tous ces événements (comme le clic, etc.) sont ajoutés à cette file d'attente. 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.
Désormais, lorsque vous appelez setTimeout
ou que setInterval
votre rappel est enregistré dans un minuteur dans le navigateur et qu'il est ajouté à la file d'attente d'événements après l'expiration du délai imparti, javascript prend l'événement de la file d'attente et l'exécute.
Cela arrive, car les moteurs javascript sont à thread unique et ne peuvent exécuter qu'une seule chose à la fois. Ainsi, ils ne peuvent pas exécuter d'autres javascript et garder une trace de votre minuterie. C'est pourquoi ces minuteries sont enregistrées avec le navigateur (le navigateur n'est pas à thread unique) et il peut garder une trace du minuteur et ajouter un événement dans la file d'attente après l'expiration du minuteur.
la même chose se produit setInterval
uniquement 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 actualisée.
Remarque
Le paramètre de retard que vous passez à ces fonctions est le temps de retard minimum pour exécuter le rappel. En effet, après l'expiration du minuteur, le navigateur ajoute l'événement à la file d'attente à exécuter par le moteur javascript, mais l'exécution du rappel dépend de la position de vos événements dans la file d'attente et comme le moteur est à thread unique, il exécutera tous les événements dans la file d'attente une par une.
Par conséquent, votre rappel peut parfois prendre plus que le délai spécifié pour être appelé, spécialement lorsque votre autre code bloque le thread et ne lui laisse pas le temps de traiter ce qui se trouve dans la file d'attente.
Et comme je l'ai mentionné, javascript est un fil unique. Donc, si vous bloquez le fil pendant longtemps.
Comme ce code
while(true) { //infinite loop
}
Votre utilisateur peut recevoir un message indiquant que la page ne répond pas .
setTimeout(function(){/*YourCode*/},1000);