setTimeout和setInterval的执行会延时吗
setInterval的回调函数不是定时执行
我们都知道js是单线程机制,异步也是伪异步
所谓异步调用的原理其实是将代码插入到代码执行队列中实现(代码的延迟执行)
代码插入点前的代码执行时间超过了传入setTimeout或setInterval的设定时间会怎样呢?
这样肯定会导致第一次的setTimeout或setInterval不能按时执行
而下一次触发时间则是在setInterval回调函数执行完毕之后
假设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);