Le code suivant imprime un résultat différent entre Firefox et Chrome
var start = Date.now() var id = setInterval(function interval() { var whileStart = Date.now() console.log(whileStart - start) while (Date.now() - whileStart < 250) { } }, 100) setTimeout(function timeout() { clearInterval(id) console.log('timeout',Date.now() - start) }, 500)
3 Réponses :
File d'attente de Settimeout Votre demande d'être traitée à la première occasion après le délai spécifié. Une fois que le délai s'est écoulé et la pile d'appels est vide em> votre demande est traitée. Cela signifie qu'il peut y avoir de légères variations dans le timing en fonction de ce que le moteur du navigateur se passe. P>
... ou même à quel point la boucle d'événement est granulable. Même si cela n'a rien d'autre "continu", il n'est pas obligé d'exécuter votre rappel en attente dès que possible avec une fiabilité de milliseconde.
La différence se pose à cause des différences de code entre les deux navigateurs.
p>
"use strict"; var start = Date.now() setTimeout(function timeout() { // start the timeout first clearInterval(id) console.log('timeout',Date.now() - start) }, 400) var id = setInterval(function interval() { var whileStart = Date.now() console.log(whileStart - start) while (Date.now() - whileStart < 250) { } }, 100)
En effet, Chrome La mise en œuvre de donc cela donne p> Notez que le dernier intervalle Notez également que le comportement de Chrome peut devenir la norme dans un proche avenir: https://github.com/whatwg/html/issues/3151 p> p> seinterval code>
corrige la dérive entre chaque appel.
Donc, au lieu d'appeler aveuglément appeler à nouveau settimeout (fn, 250) code> à la fin du rappel de l'intervalle, il est en fait
Settimeout (Fn, max (maintenant - 250, 0)) Code> .
@ 600 code> dépend effectivement sur lequel de
Timeout code> ou
intervalle code> comme prévu en premier. P>
Parce que rien garantit i> lorsque l'une de ces fonctions fonctionnera; Le calendrier exact dépend des internes de la boucle d'événement.