数码资讯
setInterval定时器的解决问题的方法
如果你计划在倒计时使用setInterval JS、定时等功能,往往是不准确的,因为回调函数setInterval然后后立即执行,将执行的计算资源闲置下来的系统。但下一次触发时间setInterval回调函数是后才执行的,所以如果在setInterval执行计算的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(即循环时间)来计算下一触发器的时间,从而校正当前触发延迟。
以下是输出
复制代码代码如下所示:
一百八十六
二百
二百三十
二百七十一
一百五十八
八百九十九
九百
八百九十九
九百
八百九十九
八百九十九
八百九十九
九百零二
八百九十九
四百一十八
二百零二
二百三十二
二百六十六
一百四十五
一百七十四
一百九十二
二百一十四
二百四十二
二百六十八
一百四十九
一百七十九
二百一十四
......
可以看出,虽然触发时间不是绝对准确的,但误差累积不是由每个触发器的及时校正引起的。
下面的代码可以解释这个问题
复制代码代码如下所示:
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(即循环时间)来计算下一触发器的时间,从而校正当前触发延迟。
以下是输出
复制代码代码如下所示:
一百八十六
二百
二百三十
二百七十一
一百五十八
八百九十九
九百
八百九十九
九百
八百九十九
八百九十九
八百九十九
九百零二
八百九十九
四百一十八
二百零二
二百三十二
二百六十六
一百四十五
一百七十四
一百九十二
二百一十四
二百四十二
二百六十八
一百四十九
一百七十九
二百一十四
......
可以看出,虽然触发时间不是绝对准确的,但误差累积不是由每个触发器的及时校正引起的。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。