В JS, если вы планируете использовать SetInterval для обратного отсчета, времени и других функций, это часто неточно, потому что функция обратного вызова SetInterval не выполняется сразу после достижения времени, но не будет выполнена до тех пор, пока вычислительные ресурсы системы не будут простым. Следующее время триггера не запускается после выполнения функции обратного вызова SetInterval. Следовательно, если расчеты, выполняемые в SetInterval, слишком трудоемкие, или есть другие трудоемкие задачи, выполняемые, время SetInterval станет все более неточным и имеет очень серьезную задержку.
Следующий код может проиллюстрировать эту проблему
Кода -копия выглядит следующим образом:
var startTime = new Date (). getTime ();
var count = 0;
// трудоемкие задачи
setInterval (function () {
var i = 0;
в то время как (i ++ <10000000000);
}, 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;
в то время как (i ++ <10000000000);
}, 0);
функция фиксирована () {
count ++;
var offset = new Date (). getTime () - (StartTime + Count * 1000);
var в следующее время = 1000 - смещение;
if (в следующее время <0) на следующее время = 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
......
Можно видеть, что, хотя время триггера не является абсолютно точным, поскольку каждый триггер скорректируется во времени, накопление ошибок не вызвано.