No JS, se você planeja usar o SetInterval para contagem regressiva, tempo e outras funções, geralmente é impreciso, porque a função de retorno de chamada do setInterval não é executada imediatamente após o atendimento do tempo, mas não será executado até que os recursos de computação do sistema estejam ociosos. O próximo tempo de gatilho não é iniciado após a execução da função de retorno de chamada setInterval. Portanto, se os cálculos executados no SetInterval forem muito demorados, ou houver outras tarefas demoradas sendo executadas, o momento do setInterval se tornará cada vez mais impreciso e tiver um atraso muito sério.
O código a seguir pode ilustrar este problema
A cópia do código é a seguinte:
var startTime = new Date (). getTime ();
var count = 0;
// tarefas consumidas por tempo
setInterval (function () {
var i = 0;
enquanto (i ++ <100000000);
}, 0);
setInterval (function () {
contagem ++;
console.log (new Date (). getTime () - (startTime + contagem * 1000));
}, 1000);
O código gera o tempo de acionamento do setInterval e o atraso milissegundos que devem ser acionados corretamente.
A cópia do código é a seguinte:
176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......
Pode -se observar que o atraso está ficando cada vez pior.
Para usar funções de tempo relativamente precisas em JS, podemos
A cópia do código é a seguinte:
var startTime = new Date (). getTime ();
var count = 0;
setInterval (function () {
var i = 0;
enquanto (i ++ <100000000);
}, 0);
função fixa () {
contagem ++;
var offset = new Date (). getTime () - (StartTime + contagem * 1000);
var próximo = 1000 - deslocamento;
if (próximo tempo <0) próximo = 0;
setTimeout (corrigido, na próxima hora);
console.log (new Date (). getTime () - (startTime + contagem * 1000));
}
setTimeout (corrigido, 1000);
No código, a lacuna entre o tempo atual e o tempo preciso é calculado subtraindo 1000 (ou seja, o período do período), corrigindo assim o atraso do gatilho atual.
Abaixo está a saída
A cópia do código é a seguinte:
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
......
Pode -se observar que, embora o tempo de gatilho não seja absolutamente preciso, pois cada gatilho é corrigido no tempo, nenhum acúmulo de erros é causado.