En JS, si planea usar SetInterval para cuenta atrás, tiempo y otras funciones, a menudo es inexacta, porque la función de devolución de llamada de SetInterval no se ejecuta inmediatamente después de alcanzar el tiempo, pero no se ejecutará hasta que los recursos informáticos del sistema estén inactivos. El siguiente tiempo de activación no se inicia después de ejecutar la función de devolución de llamada SetInterval. Por lo tanto, si los cálculos ejecutados en SetInterval requieren demasiado tiempo, o se ejecutarán otras tareas que requieren mucho tiempo, el momento de SetInterval se volverá cada vez más inexacto y tiene un retraso muy grave.
El siguiente código puede ilustrar este problema
La copia del código es la siguiente:
var starttime = new Date (). GetTime ();
Var Count = 0;
// tareas que consumen mucho tiempo
setInterval (function () {
var i = 0;
mientras (i ++ <100000000);
}, 0);
setInterval (function () {
contar ++;
console.log (nueva fecha (). getTime () - (starttime + count * 1000));
}, 1000);
El código genera el tiempo de activación SetInterval y los milisegundos de retraso que deben activarse correctamente.
La copia del código es la siguiente:
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......
Se puede ver que la demora está empeorando cada vez más.
Para usar funciones de tiempo relativamente precisas en JS, podemos
La copia del código es la siguiente:
var starttime = new Date (). GetTime ();
Var Count = 0;
setInterval (function () {
var i = 0;
mientras (i ++ <100000000);
}, 0);
función fija () {
contar ++;
Var offset = new Date (). GetTime () - (starttime + count * 1000);
var siguiente tiempo = 1000 - desplazamiento;
if (siguiente <0) nexttime = 0;
setTimeout (fijo, siguiente);
console.log (nueva fecha (). getTime () - (starttime + count * 1000));
}
setTimeOut (fijo, 1000);
En el código, la brecha entre el tiempo actual y el tiempo preciso se calcula restando 1000 (es decir, el tiempo del período), corrigiendo así el retraso del disparador de corriente.
A continuación se muestra la salida
La copia del código es la siguiente:
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
......
Se puede ver que aunque el tiempo de activación no es absolutamente preciso, ya que cada disparador se corrige en el tiempo, no se causa la acumulación de errores.