23

嘭,setTimeout 炸了

 4 years ago
source link: https://mp.weixin.qq.com/s/LXjVzdnZxGQzX3dVWlM79g
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天要说的很简单,没有 setTimeout 的基本用法,也没有什么特殊用法。

就是想记录一下 setTimeout 的一个特殊情况,分享给可能也不知道的你们。

setTimeout 的基本写法大家都不陌生,如下:

setTimeout(() => {

// 说,你倒计时想干什么

} , millisecond )

其中第二个参数是需要延时执行的毫秒数,大家应该都知道这个时间是不准确的,可以理解为最短延时。至于为什么是不准确,事件循环了解一下。

但是这个最短延时也会骗人,因为它可能会爆炸:joy:。

今天跟测一个项目,前端需要通过延时的方式去显示某课程是否开始,未开始展示倒计时界面,倒计时至开始时去掉倒计时界面,拉取主体内容。

但是测试小姐姐反馈说她的课程没有开始,没有显示倒计时,直接就显示主内容。并且没有复现步骤,只此一例。

我表示很诧异,但是也没办法。于是使出十八般武艺,开始在测试环境打断点调试,分析代码逻辑。好半天之后,纳尼,逻辑肯定是对的,我相信我的判断。

然后我突然开始怀疑 setTimeout 的倒计时时间问题。于是开始查,最后查到了原因,真的是这货的锅,它因为延时时间过长,炸了。

这就是今天的重点: setTimeout的延时毫秒数是有限制的millisec参数是Int32类型的,最大值为 2^31 - 1,即 2147483647。一旦超过这个限制,millisec参数将被视为0,代码会被立马执行

setInterval也一样,毫秒数过大会被当做0,立即执行。

至于 解决方案 也比较简单,有以下三种:

  1. 可以对setTimeout进行二次封装,对传入的延时毫秒数做个判断,如果超出限制,给出警告,并使用最大允许延时毫秒进行执行、或者给出警告后不执行。相信我,没有人会等得了这么长时间的。

  2. 可以用setInterval来替换setTimeout, 每一秒延时毫秒数减1,为0时执行动作。

  3. 从产品层面解决这个问题,如果等待时间过长,可以用其他的方式来提醒。则不需要倒计时了。

看完之后,以后如果你也遇到 setTimeout 失灵的情况,记得想起这茬。

关于奇舞周刊

《奇舞周刊》是360公司专业前端团队「 奇舞团 」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

fI773i6.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK