Wenn Sie in JS ein SetInterval für Countdown, Timing und andere Funktionen verwenden möchten, ist dies häufig ungenau, da die Rückruffunktion von SetInterval nicht sofort nach der Erreichung der Zeit ausgeführt wird, sondern erst ausgeführt wird, wenn die Rechenressourcen des Systems im Leerlauf ausgeführt werden. Die nächste Auslöserzeit wird nicht gestartet, nachdem die SetInterval -Rückruffunktion ausgeführt wurde. Wenn die in setInterval ausgeführten Berechnungen zu zeitaufwändig sind oder andere zeitaufwändige Aufgaben ausgeführt werden, wird das Timing von SetInterval immer ungenau und hat eine sehr schwerwiegende Verzögerung.
Der folgende Code kann dieses Problem veranschaulichen
Die Codekopie lautet wie folgt:
var startTime = new Date (). GetTime ();
var count = 0;
// zeitaufwändige Aufgaben
setInterval (function () {
var i = 0;
während (i ++ <100000000);
}, 0);
setInterval (function () {
zählen ++;
console.log (neues Datum (). GetTime () - (StartTime + Count * 1000));
}, 1000);
Der Code gibt die SetInterval -Triggerzeit und die Verzögerungs -Millisekunden aus, die korrekt ausgelöst werden sollten.
Die Codekopie lautet wie folgt:
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......
Es ist ersichtlich, dass die Verzögerung immer schlechter wird.
Um relativ genaue Timing -Funktionen in JS zu verwenden, können wir
Die Codekopie lautet wie folgt:
var startTime = new Date (). GetTime ();
var count = 0;
setInterval (function () {
var i = 0;
während (i ++ <100000000);
}, 0);
Funktion fixed () {
zählen ++;
var offset = new Date (). GetTime () - (StartTime + Count * 1000);
Var Next Time = 1000 - Offset;
if (nächstes <0) nächstes = 0;
setTimeout (behoben, nächstes);
console.log (neues Datum (). GetTime () - (StartTime + Count * 1000));
}
setTimeout (behoben, 1000);
Im Code wird die Lücke zwischen der aktuellen Zeit und der genauen Zeit durch Subtrahieren von 1000 (dh der Periodenzeit) berechnet, wodurch die Verzögerung des Stromauslösers korrigiert wird.
Unten ist die Ausgabe
Die Codekopie lautet wie folgt:
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
......
Es ist ersichtlich, dass zwar die Auslöserzeit nicht absolut genau ist, da jeder Auslöser zeitlich korrigiert wird, aber keine Fehlerakkumulation verursacht wird.