浏览器功能(2) - 页面长时间休眠时 setTimeout 暂停执行
这也是前段时间遇到的一个特殊问题,页面长时间休眠时 setTimeout 定时器会暂停执行。
这个问题之前在看 setTimeout 时就已经知道有这个问题,即 setTimeout定时器在浏览器最小化进入后台后,或 页面长时间处于休眠状态(即页面不显示在最前面)的情况下,页面内的定时器也会进入休眠,以减少浏览器的缓存占用以及电脑的内存占用,然后等到页面被重新激活后,定时器也被同步激活,从而继续执行。
但,这个执行是基于定时器休眠之前的参数继续执行,而不是以最新的环境参数执行,从而就会导致一些问题。
如果这个问题一开始就出现了,也就不会有问题了,无非是页面被激活后重新获取参数,重新设置定时器而已。
但最坑的是,如果页面只是短时间被隐藏,尚未达到休眠的程度,比如切换浏览器页面标签、或 浏览器被其他东西全屏遮住了、或 浏览器短时间最小化进入后台,这时定时器实际上依然在执行。
因此这就给了我一种错觉,以为 setTimeout 的休眠暂停执行机制已经没有了,从而在页面被重新激活后,并未做任何操作,从而导致一些问题
以当前时间 2022-06-02 11:26 为基准时间,然后以 2022-06-02 18:06 为截止时间,计算中间的时间差(时:分:秒 小时数分钟数秒数),从而设置定时器。尔后将当前浏览器标签切换到其他标签,再把当前浏览器窗口最小化。
起始时间, 截止时间, 当前相差的小时数分钟数秒数
这个问题之前在看 setTimeout 时就已经知道有这个问题,即 setTimeout定时器在浏览器最小化进入后台后,或 页面长时间处于休眠状态(即页面不显示在最前面)的情况下,页面内的定时器也会进入休眠,以减少浏览器的缓存占用以及电脑的内存占用,然后等到页面被重新激活后,定时器也被同步激活,从而继续执行。
但,这个执行是基于定时器休眠之前的参数继续执行,而不是以最新的环境参数执行,从而就会导致一些问题。
如果这个问题一开始就出现了,也就不会有问题了,无非是页面被激活后重新获取参数,重新设置定时器而已。
但最坑的是,如果页面只是短时间被隐藏,尚未达到休眠的程度,比如切换浏览器页面标签、或 浏览器被其他东西全屏遮住了、或 浏览器短时间最小化进入后台,这时定时器实际上依然在执行。
因此这就给了我一种错觉,以为 setTimeout 的休眠暂停执行机制已经没有了,从而在页面被重新激活后,并未做任何操作,从而导致一些问题
以当前时间 2022-06-02 11:26 为基准时间,然后以 2022-06-02 18:06 为截止时间,计算中间的时间差(时:分:秒 小时数分钟数秒数),从而设置定时器。尔后将当前浏览器标签切换到其他标签,再把当前浏览器窗口最小化。
起始时间, 截止时间, 当前相差的小时数分钟数秒数
几个小时过去后,现在是 2022-06-02 14:44 了。截止时间不变,还是 2022-06-02 18:06,那么计算下来的时间差呢,如下图所示:
现在时间, 浏览器窗口重新激活且切换到对应标签后,定时器重新开始执行后的时间差, 手动刷新页面,重新设置定时器并执行后的时间差从后面两张图以及和 11:26时的时间差值截图 对比可以看出:
- 浏览器窗口重新激活且切换到对应标签后,定时器重新开始执行后的时间差,和之前 11:26 时的时间差值 差不到好多。这说明,浏览器在最小化切换到后台后 定时器还执行了一段时间,然后就暂停了。
- 重新激活后的定时器,虽然重新开始执行,但却是基于定时器休眠之前的参数执行的。这其间的差值【后两张图时间差值 差距很明显】,setTimeout并未做处理,这就需要我们自行处理。
- 页面刷新后,原有定时器被清空,页面在重新获取参数后重新设置定时器,setTimeout 正常执行,时间差值也正常了。