setInterval的时间误差
setInterval(fn,300);
setInterval 执行机制,300ms会检测一次任务队列中有无未执行的上一次任务fn,如果没有则将fn加入任务队列,如果有则跳过。由于js单线程,如果在执行fn前还要耗时的任务执行,则会暴露缺点
1.某些间隔会被跳过
2.可能多个定时器会连续执行
setTimeout 执行机制
setTimeout(fn,300);
每隔300ms会将fn加入到任务队列中。
用setTimeout 模拟 setInterval
1.利用setTimeout能解决 间隔会被跳过缺点
2.利用递归调用setTimeout 能解决多个定时器连续执行的缺点,确保执行fn的间隔时间>=300ms;由于js单线程,只能保证每隔300将fn加入到任务队列,fn执行的时机与任务队列中的其他任务是否执行完毕有关。
class Poll{
constructor(){
this.clearTime = null;
}
setInter(fn,time){
this.clearTime = setTimeout(()=>{
fn();
this.setInter(fn,time);
},time)
}
clearInter(){
if(this.clearTime){
clearTimeout(this.clearTime);
}
}
}
标签:执行,setInterval,要用,clearTime,队列,setTimeout,fn
From: https://www.cnblogs.com/honkerzh/p/16764776.html