Di JS, jika Anda berencana untuk menggunakan setInterval untuk hitung mundur, waktu dan fungsi lainnya, sering kali tidak akurat, karena fungsi panggilan balik dari SetInterval tidak dieksekusi segera setelah waktu tercapai, tetapi tidak akan dieksekusi sampai sumber daya komputasi sistem menganggur. Waktu pemicu berikutnya tidak dimulai setelah fungsi panggilan balik setInterval dijalankan. Oleh karena itu, jika perhitungan yang dieksekusi dalam setInterval terlalu memakan waktu, atau ada tugas lain yang memakan waktu yang dieksekusi, waktu setInterval akan menjadi semakin tidak akurat dan memiliki penundaan yang sangat serius.
Kode berikut dapat menggambarkan masalah ini
Salinan kode adalah sebagai berikut:
var startTime = new date (). getTime ();
var count = 0;
// Tugas yang memakan waktu
setInterval (function () {
var i = 0;
sementara (i ++ <100000000);
}, 0);
setInterval (function () {
Count ++;
console.log (tanggal baru (). getTime () - (startTime + count * 1000));
}, 1000);
Kode mengeluarkan waktu pemicu setInterval dan penundaan milidetik yang harus dipicu dengan benar.
Salinan kode adalah sebagai berikut:
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......
Dapat dilihat bahwa penundaan semakin buruk.
Untuk menggunakan fungsi waktu yang relatif akurat di JS, kami bisa
Salinan kode adalah sebagai berikut:
var startTime = new date (). getTime ();
var count = 0;
setInterval (function () {
var i = 0;
sementara (i ++ <100000000);
}, 0);
fungsi tetap () {
Count ++;
var offset = Tanggal baru (). GetTime () - (StartTime + Count * 1000);
var nexttime = 1000 - offset;
if (nexttime <0) nexttime = 0;
setTimeout (diperbaiki, waktu berikutnya);
console.log (tanggal baru (). getTime () - (startTime + count * 1000));
}
setTimeout (diperbaiki, 1000);
Dalam kode, kesenjangan antara waktu saat ini dan waktu yang akurat dihitung dengan mengurangi 1000 (yaitu, waktu periode), dengan demikian memperbaiki keterlambatan pemicu saat ini.
Di bawah ini adalah output
Salinan kode adalah sebagai berikut:
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
......
Dapat dilihat bahwa meskipun waktu pemicu tidak sepenuhnya akurat, karena setiap pemicu diperbaiki dalam waktu, tidak ada akumulasi kesalahan yang disebabkan.