Wenn Sie in js planen, setInterval für Countdown, Timing und andere Funktionen zu verwenden, ist dies oft ungenau, da die Rückruffunktion von setInterval nicht sofort nach Ablauf der Zeit ausgeführt wird, sondern erst ausgeführt wird, nachdem die Systemrechenressourcen inaktiv sind. Und die nächste Triggerzeit beginnt zu zählen, nachdem die Rückruffunktion setInterval ausgeführt wurde. Wenn also die in setInterval durchgeführten Berechnungen zu zeitaufwändig sind oder andere zeitaufwändige Aufgaben ausgeführt werden, wird das Timing von setInterval immer ungenauer und die Verzögerung wird schwerwiegend sein.
Der folgende Code kann dieses Problem veranschaulichen
var startTime = new Date().getTime();
var count = 0;
//Zeitraubende Aufgabe
setInterval(function(){
var i = 0;
while(i < 100000000);
setInterval(function(){
console.log(new Date()). getTime() - (startTime count * 1000)) ; >
Code kopieren
Der Code lautet wie folgt:
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
.. ....
Man sieht, dass die Verzögerung immer schwerwiegender wird
In Um eine relativ genaue Timing-Funktion in js zu verwenden, können wir
Code kopieren
Der Code lautet wie folgt:
}, 0);
function failed() {
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);
Im Code wird die Differenz zwischen der aktuellen Zeit und der genauen Zeit von 1000 subtrahiert (das heißt). , die Zykluszeit), um die nächste Triggerzeit zu berechnen und so die aktuelle Triggerverzögerung zu korrigieren
Unten ist die Ausgabe
Code kopieren
Der Code lautet wie folgt:
899
900
899
899
899
902
899
418
202
232
266
145
174
192
214
242
268
149
179
214
.....
Es ist zu erkennen, dass die Die Auslösezeit ist nicht absolut genau, da jeder Auslöser rechtzeitig korrigiert wird und es zu keiner Anhäufung von Fehlern kommt.