Dans JS, si vous prévoyez d'utiliser SetInterval pour le compte à rebours, le calendrier et d'autres fonctions, il est souvent inexact, car la fonction de rappel de SetInterval n'est pas exécutée immédiatement après le moment de la réalisation, mais ne sera pas exécutée tant que les ressources informatiques du système sont inactives. Le temps de déclenchement suivant n'est pas démarré après l'exécution de la fonction de rappel SetInterval. Par conséquent, si les calculs exécutés dans SetInterval sont trop longs ou qu'il y a d'autres tâches longues exécutées, le moment de SetInterval deviendra de plus en plus inexact et a un retard très grave.
Le code suivant peut illustrer ce problème
La copie de code est la suivante:
var startTime = new Date (). GetTime ();
Var Count = 0;
// des tâches longues
setInterval (function () {
var i = 0;
while (i ++ <100000000);
}, 0);
setInterval (function () {
Count ++;
console.log (new Date (). GetTime () - (startTime + Count * 1000));
}, 1000);
Le code sortira l'heure de déclenchement SetInterval et les millisecondes de retard qui doivent être déclenchées correctement.
La copie de code est la suivante:
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......
On peut voir que le retard s'aggrave.
Afin d'utiliser des fonctions de synchronisation relativement précises dans JS, nous pouvons
La copie de code est la suivante:
var startTime = new Date (). GetTime ();
Var Count = 0;
setInterval (function () {
var i = 0;
while (i ++ <100000000);
}, 0);
fonction fixe () {
Count ++;
var offset = new Date (). getTime () - (starttime + count * 1000);
var prochain = 1000 - Offset;
si (la prochaine fois <0) suivante = 0;
setTimeout (fixe, la prochaine fois);
console.log (new Date (). GetTime () - (startTime + Count * 1000));
}
setTimeout (fixe, 1000);
Dans le code, l'écart entre l'heure actuelle et le temps précis est calculé en soustrayant 1000 (c'est-à-dire la période de période), corrigeant ainsi le retard du déclencheur actuel.
Ci-dessous est la sortie
La copie de code est la suivante:
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 peut voir que bien que le temps de déclenchement ne soit pas absolument précis, car chaque déclencheur est corrigé dans le temps, aucune accumulation d'erreur n'est causée.