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);
全部评论

相关推荐

2024-12-16 18:00
已编辑
门头沟学院 Java
摆摆不摆:想年轻多拼拼赚钱就去华子,想轻松点就去media
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务