论题
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()。
标签:定时器,setInterval,任务,num,超时,setTimeout,最好 From: https://blog.csdn.net/weixin_72254790/article/details/140994040