setInterval未完成时回调函数的执行

转自简书https://www.jianshu.com/p/0ad05e325f9b
在自己写轮播图玩的时候遇到了setinterval的问题,在网上查了很久,查到了一个非常满意的解答,并做了验证。
非常感谢作者mingttong,以下为转载内容

在参加360面试的时候面试官问到了这样的一道题:

“setInterval和setTimeout有什么区别”

我当时只说出了最基本的区别——一个是倒计时,一个是循环。面试官一脸淫荡的看着我说:“如果setInterval计时器的回调函数执行完需要5秒,而计时器时间间隔为3秒,那会发生什么?”

嘿呀,我居然没想到这一点,但凭借我扎实的JS功底,这点对我来说不是小事。我告诉他那下一次循环就会插入到队列中,等待着此次循环执行完后再执行。

面试官又是一脸淫荡地看着我,“其实并不会,如果之前的代码还没有执行完,那他就会跳过这次循环,再等3秒执行下一次循环。”
将他说的话整理一下应该是下面这样:

//0s..............................第一次添加定时器
//3s..............................第一次执行定时器代码,并且第二次添加定时器
//6s..............................第二次执行定时器代码失败,跳过此次循环,再次添加第二次定时器
//8s..............................执行完第一次定时器代码
//9s..............................第二次执行定时器代码,并且第三次添加定时器
//12s............................第三次执行定时器代码失败,跳过此次循环,再次添加第三次定时器
//14s............................执行完第二次定时器代码

“如果之前回调没有执行完,则不能再次执行当前回调,因此会跳过此次回调”
被面试官鄙视了一番,很沮丧。面试官告诉我在《高程3》中写有这部分的内容,让我回去好好看。
回来我就看了一下这部分内容,具体位置在P610的“22.3.1 重复的定时器”,书上是这么说的:

当使用setInterval()时,仅当没有该定时器的任何其他代码示例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔

今天还和小伙伴们讨论了一番,但我发现我有点误解这段话的意思。

有几个关键词——定时器代码、队列。

其实就是说,当我定时器到了指定时间后,要执行这一波代码时,如果上一波定时器代码还没有完全执行完的话,我就不会执行我这一波代码,也不会将他加入到队列中排队,而是调到下一波倒计时。
看来面试官没蒙我,但是想起他那淫荡的表情我又有些不敢相信,于是我自己做了次试验。
让程序滞留固定时间的方法如下:

function 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值