setTimeout,setInterval计时器不准的问题

2021-04-26  本文已影响0人  他爱在黑暗中漫游

setTimeout、setInterval 属于定时触发器线程属于macrotask,它的回调会受到GUI渲染、事件触发、http请求、等的影响。所以这两个不适合做精准的定时。最好的方法是定时矫正,用new Date(targetDate:Date - new Date )格式化成你需要的时分秒即可。

setInterval的回调函数并不是到了时间立即执行,而是等系统计算资源空闲下来后才会执行。 下一次触发时间是在setInterval回调函数执行完毕后才开始的。

为了js里可以使用相对准确的计时功能,我们可以用setTimeout代替setInterval

每次触发及时修正

var startTime = new Date().getTime();
var count = 0;
setInterval(function(){
    var i = 0;
    while(i++ < 100000000);
}, 0);
function fixed() {
    count++;
    var offset = new Date().getTime() - (startTime + count * 1000);
    var nextTime = 1000 - offset;
    if (nextTime < 0) nextTime = 0;
    setTimeout(fixed, nextTime);
     
    console.log(new Date().getTime() - (startTime + count * 1000));
}
setTimeout(fixed, 1000);

参考 https://www.cnblogs.com/zouxinping/p/5038287.html

上一篇 下一篇

猜你喜欢

热点阅读