js では、カウントダウン、タイミング、その他の関数に setInterval を使用する予定がある場合、setInterval のコールバック関数は時間が経過した直後に実行されず、システム コンピューティング リソースがアイドル状態になってから実行されるため、多くの場合不正確になります。そして、次のトリガー Time は setInterval コールバック関数が実行された後にカウントを開始するため、setInterval 内で実行される計算に時間がかかりすぎる場合、または他の時間のかかるタスクが実行されている場合、setInterval のタイミングはますます不正確になり、遅延が発生します。
次のコードはこの問題を示しています
var startTime = new Date().getTime();
var count = 0;
//時間のかかるタスク
setInterval(function(){
var i = 0;
while(i < 100000000), 0);
setInterval(){
count ;
console.log(). 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 }, 0);
関数 fixed() {
count ;
var offset = new Date().getTime() - (startTime count * 1000); = 1000 - オフセット;
if (nextTime
console.log(new Date().getTime() count * 1000));
}
setTimeout(fixed, 1000);
コードでは、現在時刻と正確な時刻の差が 1000 から減算されます。 、サイクル時間) を計算して、現在のトリガー遅延を修正します。
以下は出力です
コードをコピーします
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
....
各トリガーは時間内に修正されるため、トリガー時間は完全に正確ではありません。誤差が蓄積されることはありません。