SetInterval retards pas précis

Je crée actuellement un compte à rebours en utilisant setInterval mais au moment où il fonctionne plus lentement qu'il le devrait. Selon le MDN , le paramètre de délai est en millisecondes, mais il n'est pas exact.

J'ai comparé mon compte à rebours à celui sur mon téléphone et le téléphone fonctionne presque 5 fois plus vite.

var count = setInterval( function() { if (iMil == 0) { if (iS == 0) { if (iMin == 0) { if (iH == 0) { // DONE } else { iH--; iMin = 59; iS = 59; iMil = 999; } } else { iMin--; iS = 59; iMil == 999; } } else { iS--; iMil = 999; } } else { iMil--; } hours.text(iH); minutes.text(iMin); seconds.text(iS); milliseconds.text(iMil); }, 1 ); 

C'est la partie principale de mon script. Les variables hours , minutes , seconds et milliseconds sont des éléments d'objet jQuery.

Ce que je reçois, est-ce qu'il y a une raison pour laquelle il court plus lentement qu'on ne le suppose aussi?

setInterval() n'est pas garanti pour fonctionner parfaitement à l'heure en javascript. C'est en partie parce que JS est simple et en partie pour d'autres raisons. Si vous souhaitez afficher une heure avec setInterval() obtenez l'heure actuelle sur chaque horloge et affichez-la. Le setInterval() ne sera pas votre minuterie, mais seulement un mécanisme récurrent de mise à jour de l'écran. Votre affichage de l'heure sera toujours précis si vous le faites de cette façon.

En outre, aucun navigateur ne garantira un appel à votre intervalle à intervalles de 1 ms. En fait, de nombreux navigateurs n'appelleront jamais setInterval plus souvent que tous les 5 ms et certains encore plus longtemps que cela. De plus, si d'autres événements se produisent dans le navigateur avec un autre code répondant à ces événements, l'appel setInterval() peut être retardé encore plus longtemps. La spécification HTML5 propose 4 ms comme intervalle le plus court pour setTimeout() et 10 ms comme intervalle le plus court pour setInterval() , mais permet à l'implémentateur d'utiliser des temps minimums plus longs si désiré.

En fait, si vous regardez ce projet de spécifications pour les chronométreurs , l'étape 5 de l'algorithme indique:

Si le délai d'attente est inférieur à 10, augmentez le délai d'attente à 10.

Et, l'étape 8 dit ceci:

En option, attendez qu'un autre utilisateur-agent définisse la durée.

Et, cela inclut cette note:

Ceci est destiné à permettre aux agents utilisateurs de remplacer les délais d'attente si nécessaire pour optimiser l'utilisation du périphérique. Par exemple, certains processeurs ont un mode de faible puissance où la granularité des temporisations est réduite; Sur de telles plates-formes, les agents utilisateurs peuvent ralentir les délais pour s'adapter à ce programme au lieu d'exiger du processeur qu'il utilise le mode plus précis avec son utilisation d'énergie plus élevée associée.

Toutes les fonctions timeout / interval / schedule sont exclues pour être exécutées plus lentement.

C'est une nature de l'ordinateur et très commun dans le système d'exploitation qu'il y a beaucoup de choses que le processeur doit gérer et trop coûteux (et non possible) en tant que système en temps réel.

Si vous lisez leur API https://developer.mozilla.org/fr/docs/Web/API/window.setTimeout et https://developer.mozilla.org/fr/docs/Web/API/window.setInterval , il A déclaré "APRÈS un délai spécifié" et "délai temporel entre chaque appel". Ils ne disent pas non pas "à un moment spécifié" ni "appelés sur une période fixe"