前端中如何获得一个准确的时间戳
前提: 遇到了一个情况
有一个获得验证码的按钮, 点击一次获取验证码之后按钮置灰。
按钮上面的字为“59s后重新获取”, 随时间变成"58s",“57s”...
遇到如下case:
用户点击一下之后, 马上后台Kill掉App,之后再进去。
传统的写法,是否处于等待状态是在内存中的。
这样用户又可以点击按钮获得验证码了, 要求提供一个解决方案。
最常见的方法如下:
使用localStorage储存最后一次点击按钮的时间戳
每次点击按钮,获得验证码的时候,更新这个时间戳。
登录逻辑改成:
localStorage中获得上一次点击按钮的时间timeA
获得当前时间timeB
如果 timeA + 60 < timeB
按钮解锁, 可以进行点击
否则
计算时间差值gap = timeB - (timeA + 60)
以时间gap开始进行setTimeout
每过一秒钟更新一下对应的文案
后来,又出现了一个很坑爹的情况
用户可能进入系统设置改变时间
这种情况下,所有用户本地获得时间都不可靠了, 需要想办法从远端获得时间,对应的逻辑可以变成下面的情况
向服务器特定接口请求时间数据,获得timeB
// 后面的逻辑和上面一样
结果又来一个“后台没时间做这个服务”。需要使用其他方法来进行处理。
这就比较坑爹了, 用户端的任何时间信息是肯定不能用的, 后台又不能提供对应的接口, 要想想有什么不需要后端开发的远端能够提供对应的时间信息。
搜索一番后,发现任何发出的ajax请求,response里面的header里面一般都会有一个date信息, 里面带的是服务器那边生成HTTP协议的时候带的时间信息。
有了这个之后就有解决办法了。 不需要后台进行开发, 把请求特定接口变成请求任意接口。 使用fetch发出请求后,只要服务器给出回复,无论是正常回复还是403之类的无权限。在header里面提取出date就能获得服务器端准确的时间,之后使用这个再跑上面的逻辑就可以了。
向服务器任意已存在的接口使用fetch发起请求
收到数据,从response的header里面获得date
使用date生成当前时间timeB
// ...下面的逻辑相同