如何解决倒计时不准确的问题?
问题背景
为什么会出现倒计时不准确的问题?原因如下:
- 浏览器默认定时器精度。setTimeout 和 setInterval 函数并不能保证时间间隔十分精确,特别是在系统负载较高的时候
- 页面失去焦点或者被隐藏的时候,比如切换标签页,有些浏览器可能会降低定时器的频率来节省资源,从而提高性能。
例如:
两个倒计时同时开始,然后立刻结束,但是你如果打印结束时间,会至少相差4毫秒左右,这是浏览器的默认精度问题。
解决方法
调整倒计时逻辑(最优)
一开始从服务器直接获取倒计时结束的时间戳,然后就可以根据结束地时间搓和当前时间搓取差值然后取秒(基本上是除以1000),从而得到倒计时的实际秒数。
更新页面的话就是可以利用setInterval或者requestAnimationFrame去更新页面显示的剩余秒数。相对来说更加准确和稳定。
监听页面可见性
当页面失去焦点或者浏览器被最小化,切换标签页的时候去重新到服务器获取时间然后更新页面倒计时。严格来说,准确性也不是非常高。具体地就是可以监听 visibilitychange事件。
js
document.addEventListener('visibilitychange', function () { })实时获取服务器时间
使用 sse 或者 websocket 获取服务器时间,然后更新页面倒计时。需要服务器支持,然后呢,在客户端使用sse获取服务器时间,然后更新页面倒计时。可能会有点占用服务器资源,精确度相对来说会高一些。但是也是会有网络延时的,可以使用网络延时补偿来提高精度,例如加上往返时间的一半等等吧。