编程有意思

时间更新

此话题可以看作 精确的时间 的延申。

先说问题,我在做这个东西 Dashboard on desk,桌面上的信息面板 ,面板中可能有多个组件随时间更新,比如时钟、日历等。不同组件需要的时间数据有可能重合,比如都需要当前的分钟数。

显然,一个相对精确的时钟,是要起码每秒更新一次的,即便不显示秒钟,分钟数也应该准确的更新。

但是比如小时、日期、月份、年份、星期几……这些数据显然不需要每秒钟更新一次。当然如果只是这几个数据,每秒钟更新一次,也不是不能接受啦,反正都是现成的内置方法,虽然浪费性能,但也在可接受范围之内。但是像农历这种,就要自己书写一些相对复杂的函数进行计算了,还有输出月历(就是 31 天的表格那种),还有节气节日计算……这样七七八八乱七八糟的事情要是全都每秒钟计算一次,真的过分了点。

当然,现在的处理器运算速度都挺快的,这点小任务用不了几百毫秒,一秒钟的时间人家起码能休息一半的时长。可是这些运算的延迟是会影响到时间更新的速度的。前面掉了那么多头发希望时间更新更精准一点,这样一影响,又不怎么准了。

在页面加载的时候,当然要全都计算一下,毕竟最开始每一个值我们都不知道的。

下一秒,我们判断,秒钟数是不是大于等于上一次的值,如果是,说明分钟数没变化,那就不需要更新分钟数。分钟数都没变,其他就也都不需要重新计算了。这样其他数据就都变成了一分钟更新一次。

用同样的方法,还可以控制一些数据每小时更新一次,每天更新一次,每月更新一次……

但是,还有一个情况需要考虑,现在浏览器是可能对后台标签页进行暂停的,就是脚本不运行了,等标签页切换到前台再继续运行。

比如说在 23:59:30 页面被暂停了,等到 00:00:42 页面恢复了,脚本一判断, 42>30,所以分钟数没变,那小时日期啥的也全都不需要更新了,诶?!那就全错了呀!万一是跨年的时候,怕不是除了秒钟没一个数字是对的,这就很离谱。

这个情况非常极端,但不是没有可能发生。但即便把这个问题非常细致的解决好了,用户也一点都感知不到。(很多细节只有出问题了用户才会感知到。程序员的悲哀,呜呜呜

解决方法就是再加入一个标记——上次更新时间,每次运行更新函数都会记录下更新时间。正常情况下两次更新时间的间隔应该为一秒,如果这个时间大于某个值(比如设置为一分钟),那么脚本肯定是被暂停了。如果脚本暂停,情况就变得很复杂了,所以不费劲去做判断,索性把所有数据都更新一次。

这样,就能够比较好的保障数据的及时准确更新,并且对于性能消耗也做了较好的控制。然而用户看到的只是——这有个表。

2 个赞