这里说一下为什么要用setTimeout模拟setInterval
场景再现
如果使用setInterval,里面的回调函数中,需要执行比较长的事件,例如setInterval一个1秒钟的时间,然后callback中需要执行3秒,下一个setInterval并不会等待上一个的setInterval的callback执行完毕才执行,这样就有可能出现同一时间触发多次setInterval的callback,然后导致页面的奇怪现象。另外这样也容易造成内存溢出。而使用setTimeout代替setInterval,在setTimeout的callback中,知心完后重新新建一个setTimeout。这样就保证了每一次只会有一个定时任务执行。
1.setInterval 每到一个周期结束时就会使用clearInterval()来清除这个周期函数,然后重新生成一个新的周期函数,赋予它新的周期,从而实现动态修改周期函数的周期的目的
2. setInterval 这个方法去实现计时,但是有一个缺点,虽然能设置隔一段时间后不断执行,但是实际上只是将事件放消息队列,真正执行的时间并不确定,有可能上一个计时器任务没执行完又进来一个计时器任务,所以并不能保证能按照设定的时间去执行,
//暂停执行标记
let stop=false;
//调用定时器执行
this.Interval();
//暂时定时器的定时器
setTimeout(()=>{
stop=true;
},5000);
// 使用setTimeout模拟setInterval
function Interval(){
// 停止的条件
if (stop) { return;}
setTimeout(()=>{
console.log(new Date().getTime());
//调用自身
this.Interval()
},500)
}