JSでは、CountDown、タイミング、その他の機能にSetIntervalを使用する予定がある場合、SetIntervalのコールバック関数は時間に到達した直後に実行されないため、システムのコンピューティングリソースがアイドル状態になるまで実行されないため、しばしば不正確です。次のトリガー時間は、SetIntervalコールバック関数が実行された後に開始されません。したがって、Setintervalで実行された計算が時間がかかりすぎる場合、または他の時間のかかるタスクが実行されている場合、Setintervalのタイミングはますます不正確になり、非常に深刻な遅延があります。
次のコードは、この問題を説明できます
コードコピーは次のとおりです。
var starttime = new date()。getTime();
var count = 0;
//時間のかかるタスク
setInterval(function(){
var i = 0;
while(i ++ <100000000);
}、0);
setInterval(function(){
count ++;
console.log(new date()。gettime() - (starttime + count * 1000));
}、1000);
コードは、SETINTERVALトリガー時間と、正しくトリガーする必要がある遅延ミリ秒を出力します。
コードコピーは次のとおりです。
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888年
2048
2201
2357
2521
2679
2834
2996
......
遅延が悪化していることがわかります。
JSで比較的正確なタイミング関数を使用するために、
コードコピーは次のとおりです。
var starttime = new date()。getTime();
var count = 0;
setInterval(function(){
var i = 0;
while(i ++ <100000000);
}、0);
functionsixed(){
count ++;
var offset = new date()。gettime() - (starttime + count * 1000);
var nexttime = 1000 -offset;
if(nexttime <0)nexttime = 0;
SettimeOut(修正、次の時間);
console.log(new date()。gettime() - (starttime + count * 1000));
}
SettimeOut(固定、1000);
コードでは、現在の時間と正確な時間の間のギャップは、1000を差し引くことで計算されます(つまり、期間)。
以下は出力です
コードコピーは次のとおりです。
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
......
トリガー時間は絶対に正確ではありませんが、各トリガーは時間内に修正されるため、エラーの蓄積は発生しないことがわかります。