0
votes

seinterval différent de Chrome et Firefox

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)


1 commentaires

Parce que rien garantit lorsque l'une de ces fonctions fonctionnera; Le calendrier exact dépend des internes de la boucle d'événement.


3 Réponses :


2
votes

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 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.


1 commentaires

... 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.



0
votes

La différence se pose à cause des différences de code entre les deux navigateurs.

  1. Si vous inverserez l'ordre de démarrage des minuteries d'intervalle et de délai d'attente, Chrome se comporte de la même manière que Firefox: Li> ol>

    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)


0 commentaires

2
votes

En effet, Chrome La mise en œuvre de seinterval corrige la dérive entre chaque appel. Donc, au lieu d'appeler aveuglément appeler à nouveau settimeout (fn, 250) à la fin du rappel de l'intervalle, il est en fait Settimeout (Fn, max (maintenant - 250, 0)) .

donc cela donne xxx

Notez que le dernier intervalle @ 600 dépend effectivement sur lequel de Timeout ou intervalle comme prévu en premier.

Notez également que le comportement de Chrome peut devenir la norme dans un proche avenir: https://github.com/whatwg/html/issues/3151


0 commentaires