定时器为什么最好不要使用 setInterval()?

论题

setInterval() 会导致导致定时器"重叠"的问题,所以使用setTimeout()。

回顾

首先先了解一下setInterval()和setTimeout()的基本使用。

setTimeout(表达式,毫秒):毫秒数后表达式仅执行一次。

setInterval(表达式,毫秒):无限次在毫秒数后执行表达式。

一个生产者-临界资源问题

商品柜空位(临界资源):10个

生产:每秒生产1个

任务:商品柜空位没满的情况每秒生产1个

setInterval()如何解决

num=0;
max=10;
Production=funcation(){
    ++num
//如果达到最大值,则取消所有未执行的任务
if(num>=max){
    clearInterval(intervalId);
    alert("未执行任务已清除!")
    }
}
intervalId=setInterval(Production,1000);

值得了解的是调用 setTimeout()时,会返回一个表示该超时排期的数值 ID。这个超时 ID 是被排期执行代码的 唯一标识符,可以调用 clearTimeout()方法并传入超 时 ID取消任务。

分析:由于我们不能确定Production这个任务是否能在1秒内解决,如果定时器内的代码执行时间超过了间隔时间,下一个定时器可能会在前一个定时器结束之前开始,导致定时器"重叠",从而可能跳过一些执行周期,导致最终生产是过剩的,然后我们将多余的任务清除,不太建议这样做。

注:重叠间隔内重复生产

setTimeout如何解决

num=0;
max=10;
Production=function(){
    ++num;

//未满则设置一个超时任务
if(num<max){
    setTimeout(Production,1000)
    }

}
setTimeout(Production,1000)

注意在使用 setTimeout()时,不一定要记录超时 ID,因为它会在条件满足时自动停止,否则会 自动设置另一个超时任务。

注:递归调用保证任务结束后再判断

这个模式是设置循环任务的推荐做法。setIntervale()在实践中很少会在 生产环境下使用,因为一个任务结束和下一个任务开始之间的时间间隔是无法保证的,有些循环定时任 务可能会因此而被跳过。而像前面这个例子中一样使用 setTimeout()则能确保不会出现这种情况。

一 般来说,最好不要使用 setInterval()。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值