首页 > 其他分享 >定时器为什么最好不要使用 setInterval()?

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

时间:2024-08-07 16:24:16浏览次数:7  
标签:定时器 setInterval 任务 num 超时 setTimeout 最好

论题

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

相关文章

  • 一个定时器的轮询,页面卸载清除轮询的定时器 ,js 接口5s轮询 轮询查询应用安装状态
    在JavaScript中,如果您使用setInterval创建了一个定时器来进行轮询,并希望在页面卸载时清除这个定时器,您可以按照以下步骤实现:示例代码://假设这是查询应用安装状态的函数functioncheckInstallationStatus(){//这里应该是发起网络请求的逻辑//例如使用fetchAPI获取......
  • 情人节送女孩什么礼物最好?七夕节送女朋友礼物排行榜~
    2024年七夕情人节可就不到一周的时间就要到了,还有哪个宝子没想好送对方什么礼物的,可抓住时间临时抱佛脚了,我这里的礼物清单也不是随便选选,可是经过多个有对象的女孩子打分得出的最高分最想要的礼物清单!咱就是说不懂送什么礼物给女朋友的,看这篇就对了~1、懒人神器——希亦内裤......
  • 【STM32】TIM定时器
    个人主页TIM定时器一、简介二、基本定时器三、通用定时器1、时钟源选择2、时基单元3、输出比较和输入捕获电路(1)输出比较①PWM波形②通用定时器的输出比较电路③输出模式控制器的逻辑④输出比较基本结构(2)输入捕获①测频率的方法②输入捕获电路③主从触发模式④输入捕......
  • 【stm32】软件定时器
    【stm32】软件定时器文章目录【stm32】软件定时器@[toc]为什么软件定时器相关代码使用例程参考链接为什么为什么会想着搞个软件定时器呢?之前的esp8266模块的通信,用的延时阻塞去实现的,对主程序影响挺大的。想着改改,不想上freertos啥的操作系统,就想着之前看4G模......
  • 最好用的深拷贝方法?分享 1 段优质 JS 代码片段!
    本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 900+ 字,整篇阅读约需 1 分钟。今天分享一段优质JS代码片段,轻松实现了对象间的深度克隆。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const......
  • 入门 PyQt6 看过来(基础)23~ 定时器和线程
    一般情况下,应用程序都是单线程运行的,但如果需要执行一个特别耗时的操作,GUI界面其他操作就无法进行,用户感觉程序没有了响应,或者windows系统也认为程序运行出现了问题并自动关闭了程序。有类似的情况应用就需要采用定时器和线程。1定时器(QTimer)如果要在应用程序中周期性地运......
  • GD32使用PWM+DMA调试WS2812-RGB灯调试记录(附GD32中的TIMER定时器和DMA的踩坑记录)
    一、前言目的:对于使用STM32驱动WS2812-RGB灯,已经有很多大佬进行了分享,同时写得很好!但是对于GD32的调试WS2812确实偏少,刚好最近的项目有用到,顺便记录一下踩过的坑。开源不易,谢谢大家!感谢:特别感谢三位大佬的的博文贡献;1.GD32F470通过DMA输出PWM_gd32pwmdma-CSDN博客2.基于G......
  • 06 定时器和PWM(1)
    前言前面介绍了一下外部中断,这一节主要介绍一下内部定时器和PWM,这两个知识还是比较重要的。一、定时器1.什么是定时器定时器其实和计数器一样,我们通过设置一个值,当计数器运行一个计数寄存器向上加1或者向下减1达到这个值后,会发送一个事件,以此运行即可。这个就是定时器。2.在......
  • 【STM32 HAL库】TIM定时器与CubeMX配置
    【STM32HAL库】TIM定时器与CubeMX配置前言TIM定时器基本理论定时器的本质就是计数器!定时器的基本作用定时器分类定时器的外部时钟与从模式TIM基本定时器理论应用CubeMX配置Keil5代码输入捕获理论应用CubeMX配置Keil5代码PWM理论应用CubeMX配置Keil5代码前言......
  • 2024口碑最好五大骑行耳机精选,实测体验在线分享!
    作为有着多年骑行经验的数码博主,我深刻的明白,在骑行过程中,选择一款合适的耳机至关重要,一款合适的骑行耳机不仅可以增加骑行中的体验,还能保证骑行中的安全,骨传导耳机凭借不入耳佩戴更健康,以及开放式听音等优点成为众多骑行爱好者的首要选择。但随着骨传导耳机热度增加,市面上开始......