网易首页 > 网易号 > 正文 申请入驻

为什么要用setTimeout模拟setlnterval

0
分享至

setInterval 是一个宏任务

用多了你就会发现它并不是准确无误,极端情况下还会出现一些令人费解的问题。

下面我们一一罗列。·

推入任务队列后的时间不准确

定时器代码:

上面这句代码的意思其实是fn()将会在 N 秒之后被推入任务队列

所以,在 setInterval 被推入任务队列时,如果在它前面有很多任务或者某个任务等待时间较长比如网络请求等,那么这个定时器的执行时间和我们预定它执行的时间可能并不一致。

比如:

可以看出来,相差的时间是越来越大的,越来越不准确。

函数操作耗时过长导致的不准确

考虑极端情况,假如定时器里面的代码需要进行大量的计算(耗费时间较长),或者是 DOM 操作。这样一来,花的时间就比较长,有可能前一次代码还没有执行完,后一次代码就被添加到队列了。也会到时定时器变得不准确,甚至出现同一时间执行两次的情况。

最常见的出现的就是,当我们需要使用 ajax 查询服务器是否有新数据时,必定会有一些人会使用 setInterval,然而无论网络状况如何,它都会去一遍又一遍的发送请求,最后的间隔时间可能和原定的时间有很大的出入。

setInterval 缺点 与 setTimeout 的不同

再次强调,定时器指定的时间间隔,表示的是何时将定时器的代码添加到消息队列,而不是何时执行代码。所以真正何时执行代码的时间是不能保证的,取决于何时被主线程的事件循环取到,并执行。

上图可见,setInterval 每隔 100ms 往队列中添加一个事件;100ms 后,添加 T1 定时器代码至队列中,主线程中还有任务在执行,所以等待,some event 执行结束后执行 T1 定时器代码;又过了 100ms,T2 定时器被添加到队列中,主线程还在执行 T1 代码,所以等待;又过了 100ms,理论上又要往队列里推一个定时器代码,但由于此时 T2 还在队列中,所以 T3 不会被添加(T3 被跳过),结果就是此时被跳过;这里我们可以看到,T1 定时器执行结束后马上执行了 T2 代码,所以并没有达到定时器的效果。

综上所述,setInterval 有两个缺点:

  • 使用 setInterval 时,某些间隔会被跳过;
  • 可能多个定时器会连续执行;

可以这么理解:每个 setTimeout 产生的任务会直接 push 到任务队列中;而 setInterval 在每次把任务 push 到任务队列前,都要进行一下判断(看上次的任务是否仍在队列中,如果有则不添加,没有则添加)。

因而我们一般用 setTimeout 模拟 setInterval,来规避掉上面的缺点。

来看一个经典的例子来说明他们的不同:

做过的朋友都知道:是一次输出了 5 个 5;
那么问题来了:是每隔 1 秒输出一个 5 ?还是一秒后立即输出 5 个 5?
答案是:一秒后立即输出 5 个 5
因为 for 循环了五次,所以 setTimeout 被 5 次添加到时间循环中,等待一秒后全部执行。

为什么是一秒后输出了 5 个 5 呢?
简单来说,因为 for 是主线程代码,先执行完了,才轮到执行 setTimeout。

当然为什么输出不是 1 到 5,这个涉及到作用域的问题了,这里就不解释了。

setTimeout 模拟 setInterval

综上所述,在某些情况下,setInterval 缺点是很明显的,为了解决这些弊端,可以使用 settTimeout() 代替。

  • 在前一个定时器执行完前,不会向队列插入新的定时器(解决缺点一)
  • 保证定时器间隔(解决缺点二)

具体实现如下:

1.写一个 interval 方法

2.和 setInterval() 一样使用它

3.重置定时器

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
30年官司,百亿损失,内斗如何毁掉中国最具潜力民族品牌?

30年官司,百亿损失,内斗如何毁掉中国最具潜力民族品牌?

燕梳楼2021
2024-04-25 15:06:28
大S的妈妈给光头发强硬通告,要求他养得起大S,否则滚回韩国去。

大S的妈妈给光头发强硬通告,要求他养得起大S,否则滚回韩国去。

悍匪小蛙
2024-04-20 08:01:08
闹大了!女子质问四川文旅,被一个结子戳8根签签笑死,评论炸了

闹大了!女子质问四川文旅,被一个结子戳8根签签笑死,评论炸了

今日搞笑分享
2024-04-25 22:03:07
大陆是否会“武统台湾”?王毅外长当着美国人的面,给出答案

大陆是否会“武统台湾”?王毅外长当着美国人的面,给出答案

曹兴教授TALK
2024-04-26 15:49:10
F1 CEO:我们会与上海续约,但中国不会有两场F1

F1 CEO:我们会与上海续约,但中国不会有两场F1

独自等待Te6O
2024-04-26 15:09:22
英媒体为什么突然猛批努涅斯?利物浦赛季末崩盘果然事出有因

英媒体为什么突然猛批努涅斯?利物浦赛季末崩盘果然事出有因

敖铭
2024-04-26 15:45:27
戏子误国!国家终于出手,人民日报发声撕掉了哪些明星的遮羞布?

戏子误国!国家终于出手,人民日报发声撕掉了哪些明星的遮羞布?

橘子大娱社
2024-04-24 20:55:03
谈判再次破裂?我国或将关闭大使馆?外交部提醒:中方公民勿前往

谈判再次破裂?我国或将关闭大使馆?外交部提醒:中方公民勿前往

星辰故事屋
2024-04-22 18:16:54
韩国著名女星宣布离婚!原因是丈夫曾5次猥亵自己亲姐姐…

韩国著名女星宣布离婚!原因是丈夫曾5次猥亵自己亲姐姐…

奋斗在韩国
2024-04-25 17:27:20
与王毅谈4小时,布林肯临走前中方最高层强调一句话,望其能读懂

与王毅谈4小时,布林肯临走前中方最高层强调一句话,望其能读懂

男女那点事儿儿
2024-04-26 20:59:15
65个国家都收到了“邀请函”,却唯独没有中国,中方正式表态

65个国家都收到了“邀请函”,却唯独没有中国,中方正式表态

慢聊的历史
2024-04-26 14:21:34
大兴机场一旅客遗失水杯里竟放着3块玉器 民警帮助找回

大兴机场一旅客遗失水杯里竟放着3块玉器 民警帮助找回

北青网-北京青年报
2024-04-26 18:49:03
里程碑!山东泰山成中超历史首支实现300胜的球队

里程碑!山东泰山成中超历史首支实现300胜的球队

懂球帝
2024-04-26 22:27:16
美国高校反战示威愈演愈烈 内塔尼亚胡指责是“反犹主义浪潮”

美国高校反战示威愈演愈烈 内塔尼亚胡指责是“反犹主义浪潮”

直新闻
2024-04-25 20:40:16
洗米嫂关闭社交账号,彻底告别过去!洗米华坐牢后不再炫富变低调

洗米嫂关闭社交账号,彻底告别过去!洗米华坐牢后不再炫富变低调

娱小小新
2024-04-26 16:01:10
多少婚姻,毁在“各过各的”

多少婚姻,毁在“各过各的”

十点读书
2024-04-23 19:56:47
伊朗首都成情色胜地!少妇为孩子无奈性交易,男性为长者提供服务

伊朗首都成情色胜地!少妇为孩子无奈性交易,男性为长者提供服务

真实星球
2024-04-26 22:57:32
东莞奥特莱斯综合体要来了,总建面约16万㎡,计划明年开业

东莞奥特莱斯综合体要来了,总建面约16万㎡,计划明年开业

南方都市报
2024-04-24 17:18:08
注意!上海最高温骤降5℃,今起5天都有雨?五一假期前后天气大转折

注意!上海最高温骤降5℃,今起5天都有雨?五一假期前后天气大转折

上观新闻
2024-04-26 11:22:57
詹姆斯:我和浓眉合作6个赛季了&我们登过顶 知道夺冠需要什么

詹姆斯:我和浓眉合作6个赛季了&我们登过顶 知道夺冠需要什么

直播吧
2024-04-26 15:54:14
2024-04-27 07:18:44
爱创乐育
爱创乐育
努力成为别人心中的大神
30文章数 134关注度
往期回顾 全部

科技要闻

车展观察|德系日系绝不能放弃中国市场

头条要闻

官方回应环卫工用电子秤测灰尘:正常作业达标有奖励

头条要闻

官方回应环卫工用电子秤测灰尘:正常作业达标有奖励

体育要闻

皇社主帅:如果说谁配得上胜利那就是我们 很遗憾皇马活着逃出来

娱乐要闻

金靖回应不官宣恋情结婚的原因

财经要闻

贾跃亭,真他娘是个人才

汽车要闻

2024北京车展 比亚迪的自驱力让对手紧追猛赶

态度原创

旅游
数码
艺术
家居
公开课

旅游要闻

白俄,中国人的快乐福地?

数码要闻

小米自带线充电宝 20000mAh 上架:支持 33W 功率,售价 159 元

艺术要闻

画廊周北京迎来第八年, “漂留” 主题聚集 30 余家艺术机构与 40 场展览

家居要闻

光影之间 空间暖意打造生活律动

公开课

睡前进食会让你发胖吗?

无障碍浏览 进入关怀版