求助大佬,浏览器怎么实现定时执行 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lsy99
V2EX    问与答

求助大佬,浏览器怎么实现定时执行

  •  
  •   lsy99 2022-12-28 18:39:42 +08:00 1797 次点击
    这是一个创建于 1021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是登录之后会有一个 token 过期时间,时间不固定最长会有一个月,到了时间立刻弹框重定向到登录页,不能等到请求接口返回 403 再弹框,这个应该怎么实现呢?

    13 条回复    2022-12-29 18:05:25 +08:00
    liyang5945
        1
    liyang5945  
       2022-12-28 18:44:16 +08:00
    token 和过期时间都存到 localstorage 里,js 写个定时器不断对比当前时间和过期时间,时间到了就跳转
    lsy99
        2
    lsy99  
    OP
       2022-12-28 19:04:59 +08:00
    @liyang5945 这个提过了 PR 被拒了,被说会有性能问题,这个真的会很占用性能吗? setinterval 还不能太长要不然测试不过
    MossFox
        3
    MossFox  
       2022-12-28 19:16:53 +08:00
    需求描述总觉得有点怪,但懒得管了。如果没办法用事件触发的话,在已知 Token 过期时间的前提条件下,看这个


    过期时间小于这个值,直接放一个定时器 (是 setTimeout) 伺候。超过就拆成多个叠起来:
    setTimeout(() => setTimeout(() => { /* do something...*/ }, a), b);
    a + b = 过期时间
    liyang5945
        4
    liyang5945  
       2022-12-28 19:38:56 +08:00
    @lsy99 #2 用 webwoker 另开一个线程做这个事
    itechify
        5
    itechify  
    PRO
       2022-12-28 19:52:05 +08:00 via Android
    如果没有 refresh token 机制,到期了接口 403 到登录页,和你的主动到检测到期登录页一样的效果,一个前一点一个后一点而已,有啥区别?
    xg4
        6
    xg4  
       2022-12-28 19:54:30 +08:00
    ```ts
    interface Token {
    value: string
    expires: string
    }

    function onClear() {
    // TODO: clear
    }

    function setToken(token: string) {
    localStorage.setItem(
    'token',
    JSON.stringify({
    value: token,
    expires: new Date('2023/1/2 10:00:00').toISOString(),
    })
    )
    }

    function checkToken() {
    const okenJson = localStorage.getItem('token')
    if (tokenJson) {
    const token: Token = JSON.parse(tokenJson)
    const diff = Date.now() - new Date(token.expires).getTime()
    if (diff >= 0) {
    onClear()
    return
    }
    setTimeout(onClear, diff)
    }
    }

    checkToken()
    ```
    ChefIsAwesome
        7
    ChefIsAwesome  
       2022-12-28 20:01:02 +08:00
    这种东西哪有在前端做的。在前端做,随随便便就绕过去了,有何意义?
    lsy99
        8
    lsy99  
    OP
       2022-12-28 20:01:43 +08:00
    @MossFox 感谢,我试试
    lsy99
        9
    lsy99  
    OP
       2022-12-28 20:05:17 +08:00
    @oneisall8955
    @ChefIsAwesome
    是产品的需求,我们这里开发没有权力推掉这种需求
    ysc3839
        10
    ysc3839  
       2022-12-28 20:12:08 +08:00 via Android
    @lsy99 发一下具体的拒绝理由?你设置 10 秒或 30 秒检查一下也不会有什么性能问题吧?
    weiwoxinyou
        11
    weiwoxinyou  
       2022-12-29 09:03:41 +08:00 via Android
    微信读书 web 端做法是隔几分钟请求一下
    magnetar
        12
    magnetar  
       2022-12-29 10:56:57 +08:00
    额,发起请求前检查过期时间就行了吧
    adgfr32
        13
    adgfr32  
       2022-12-29 18:05:25 +08:00
    页面初始化的时候, 获取一下 token 的剩余时间, 然后 setTimeout
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 03:00 PVG 11:00 LAX 20:00 JFK 23:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86