setInterval定时器的解决问题的方法

如果你计划在倒计时使用setInterval JS、定时等功能,往往是不准确的,因为回调函数setInterval然后后立即执行,将执行的计算资源闲置下来的系统。但下一次触发时间setInterval回调函数是后才执行的,所以如果在setInterval执行计算的setInterval实施时间过长、或其他耗时的任务,时间会越来越不延迟严重。

下面的代码可以解释这个问题
复制代码代码如下所示:
VaR StartTime =新的日期()GetTime();
var计数= 0;
耗时的任务
setInterval(){()函数(
var I=0;
当(++ < 100000000);
},0);
setInterval(){()函数(
计数+;
console.log(新的日期()GetTime()()-(开始时间+数×1000));
},1000);

对setInterval触发时间延迟的毫秒数和正确的触发时间是在编码输出
复制代码代码如下所示:
一百七十六
三百四十
四百九十五
六百五十二
八百零七
九百六十一
一千一百一十四
一千二百六十八
一千四百二十五
一千五百七十九
一千七百三十四
一千八百八十八
二千零四十八
二千二百零一
二千三百五十七
二千五百二十一
二千六百七十九
二千八百三十四
二千九百九十六
......

可以看出,这种延误正在变得越来越严重。

为了在JS中使用相对准确的计时功能,我们可以
复制代码代码如下所示:
VaR StartTime =新的日期()GetTime();
var计数= 0;
setInterval(){()函数(
var I=0;
当(++ < 100000000);
},0);
函数固定(){
计数+;
VaR偏移=新的日期()GetTime()-(开始时间+数×1000);
下次= 1000 -弥补VaR;
如果(下次下次= 0 < 0);
setTimeout(固定,下次);

console.log(新的日期()GetTime()()-(开始时间+数×1000));
}
setTimeout(固定,1000);

在代码中,我们通过减去当前时间和精确时间之间的差值1000(即循环时间)来计算下一触发器的时间,从而校正当前触发延迟。

以下是输出
复制代码代码如下所示:
一百八十六
二百
二百三十
二百七十一
一百五十八
八百九十九
九百
八百九十九
九百
八百九十九
八百九十九
八百九十九
九百零二
八百九十九
四百一十八
二百零二
二百三十二
二百六十六
一百四十五
一百七十四
一百九十二
二百一十四
二百四十二
二百六十八
一百四十九
一百七十九
二百一十四
......

可以看出,虽然触发时间不是绝对准确的,但误差累积不是由每个触发器的及时校正引起的。