Encounter-前端如何获得一个正确的时间戳?

前端中如何获得一个准确的时间戳


前提: 遇到了一个情况

有一个获得验证码的按钮, 点击一次获取验证码之后按钮置灰。
按钮上面的字为“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
// ...下面的逻辑相同
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值