v 友们帮忙看看这段我几年前写的 定时刷新 token 的 js 代码,为什么会内存泄露?

查看 28|回复 1
作者:rookie2luochao   
背景是这样,这段代码就是 token 过期前 2 分钟刷新下 token ,但是它会在我切换到其他网页之后(这个刷新 token 的网页不关闭,后台运行),过很长一段时间在切回来就可能爆内存(可能 12 小时,可能 24 小时?),但是时间太短不会爆内存,所以我一直没找到很好的办法去测试定位
timer 是 rxjs 的定时器操作符
export function RefreshTokenComp({
  refreshTokenActor,
}: {
  refreshTokenActor: RequestActor;
}) {
  const [access$, updateAccess] = useAccessMgr();
  const access = useObservable(access$) || {};
  const { refresh_token, expireAt } = access;
  const [refreshTokenRequest] = useRequest(refreshTokenActor, {
    onSuccess({ arg }) {
      updateAccess(fromOAuthToken(arg.data));
    },
  });
  useEffect(() => {
    if (!refresh_token) return;
    const expiresIn = moment(expireAt).diff(moment(), "s") - 120; // token 过期前二分钟左右刷新
    const sub = timer(expiresIn * 1000).subscribe(() => {
      refreshTokenRequest({ refreshToken: refresh_token });
    });
    return () => {
      sub.unsubscribe();
    };
  }, [refresh_token]);
  return null;
}
wpyfawkes   
我不是太懂 JavaScript,以下是 Claude 的回复
函数实现
函数实现看起来是正确的。它使用了 useEffect 来处理 token 的刷新,这是 React 中常见的做法。然而,这段代码可能存在潜在的内存泄漏问题。在 useEffect 的清理函数中,我们取消了定时器的订阅,但是如果 refresh_token 在定时器触发之前改变,那么定时器可能会被意外地触发两次。我们应该在 useEffect 的依赖数组中添加 expiresIn 。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部