Dans js, si vous envisagez d'utiliser setInterval pour le compte à rebours, le timing et d'autres fonctions, cela est souvent inexact, car la fonction de rappel de setInterval n'est pas exécutée immédiatement une fois le temps écoulé, mais sera exécutée une fois que les ressources informatiques du système seront inactives. Et le prochain déclencheur Time commence à compter après l'exécution de la fonction de rappel setInterval, donc si les calculs effectués dans setInterval prennent trop de temps, ou si d'autres tâches fastidieuses sont en cours d'exécution, le timing de setInterval deviendra de plus en plus imprécis et le délai sera sévère
Le code suivant peut illustrer ce problème
var startTime = new Date().getTime();
var count = 0
//Tâche chronophage
setInterval(function(){
var i = 0;
while(i < 100000000);
}, 0);
setInterval(function(){
count ;
console.log(new Date(). getTime() - (startTime count * 1000)) ;
}, 1000);
Le code affiche le temps de déclenchement setInterval et le délai en millisecondes qui devrait être le temps de déclenchement correct
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
.. ....
On voit que le retard devient de plus en plus sérieux
Dans. afin d'utiliser une fonction de timing relativement précise en js, on peut
var startTime = new Date().getTime();
var count = 0;
setInterval(function(){
var i = 0;
while(i < 100000000 );
}, 0);
function fixed() {
count ;
var offset = new Date().getTime() - (startTime count * 1000); = 1000 - offset;
if (nextTime < 0) nextTime = 0;
setTimeout(fixed, nextTime);
console.log(new Date().getTime() - (startTime); count * 1000));
}
setTimeout(fixed, 1000);
Dans le code, la différence entre l'heure actuelle et l'heure exacte est soustraite de 1000 (c'est-à-dire , le temps de cycle) pour calculer le prochain temps de déclenchement, corrigeant ainsi le délai de déclenchement actuel
Vous trouverez ci-dessous la sortie
186
200
230
271
158
899
900
899
900
899
899
899
902
899
418
202
232
266
145
174
192
214
242
268
149
179
214
.....
On voit que bien que le le temps de déclenchement n'est pas absolument précis, puisque chaque déclenchement est corrigé dans le temps, il n'y a pas d'accumulation d'erreurs.