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

相关推荐

湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务