原创
落魄前端-小陈 2021-09-27 10:54:19 2966 收藏 0
定时器跑起来为何时间久了会不准确?
由于各种鸟原因(具体原因可以自己百度),会导致定时器的时间和实际时间越来越大,那怎么解决这个问题呢?
单单用settimeout来替代setinterval是不行的,还需要补时间差!
原理
每次settimeout的时候计算时间差(实际和理想的差距),然后再计算下一次settimeout需要的时间,废话不多说,上代码!
<script>
let startTime,
count,
runTime,
downSecond = 1200,
loopTimer = null;
function resetDefaultValue() {
startTime = Date.now();
count = 0;
runTime = 0;
}
resetDefaultValue();
loop();
function loop() {
runTime = Date.now();
let offsetTime = runTime - (startTime + count * 1000);
count++;
let nextTime = 1000 - offsetTime;
nextTime = nextTime > 0 ? nextTime : 0;
downSecond-- ;
console.log('时间差:'+offsetTime, ',下一次需要时间:'+ nextTime)
if (downSecond <= 0) {
clearTimeout(loopTimer)
loopTimer = null;
return false;
}
loopTimer = setTimeout(loop, nextTime);
}
</script>
效果如下图:
比如这次运行需要的时间比实际时间多 4 毫秒,那么下次定时器需要的时间就是996毫秒, 彼长我消!
怎么验证定时器是否准确:
自己的定时器设个几十分钟,同时百度打开北京时间对照,或者电脑右下角的时间对照。过一会再来看(至少几分钟后),如果差个一两秒是正常,反之不正常