lsy99
V2EX  ›  问与答

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

  •  
  •   lsy99 · Dec 28, 2022 · 2675 views
    This topic created in 1410 days ago, the information mentioned may be changed or developed.

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

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


    过期时间小于这个值,直接放一个定时器 (是 setTimeout) 伺候。超过就拆成多个叠起来:
    setTimeout(() => setTimeout(() => { /* do something...*/ }, a), b);
    a + b = 过期时间
    liyang5945
    liyang5945
    Dec 28, 2022
    4
    @lsy99 #2 用 webwoker 另开一个线程做这个事
    itechify
    itechify
    Dec 28, 2022 via Android
    5
    如果没有 refresh token 机制,到期了接口 403 到登录页,和你的主动到检测到期登录页一样的效果,一个前一点一个后一点而已,有啥区别?
    xg4
    xg4
    Dec 28, 2022
    6
    ```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 tokenJson = 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
    ChefIsAwesome
    Dec 28, 2022
    7
    这种东西哪有在前端做的。在前端做,随随便便就绕过去了,有何意义?
    lsy99
    lsy99
    OP
    Dec 28, 2022
    8
    @MossFox 感谢,我试试
    lsy99
    lsy99
    OP
    Dec 28, 2022
    9
    @oneisall8955
    @ChefIsAwesome
    是产品的需求,我们这里开发没有权力推掉这种需求😶
    ysc3839
    ysc3839
    Dec 28, 2022 via Android
    10
    @lsy99 发一下具体的拒绝理由?你设置 10 秒或 30 秒检查一下也不会有什么性能问题吧?
    weiwoxinyou
    weiwoxinyou
    Dec 29, 2022 via Android
    11
    微信读书 web 端做法是隔几分钟请求一下
    magnetar
    magnetar
    Dec 29, 2022
    12
    额,发起请求前检查过期时间就行了吧
    zh3256
    zh3256
    Dec 29, 2022
    13
    页面初始化的时候, 获取一下 token 的剩余时间, 然后 setTimeout
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1766 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 03:31 · PVG 11:31 · LAX 19:31 · JFK 22:31
    ♥ Do have faith in what you're doing.