请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

编程入门 行业动态 更新时间:2024-10-03 14:19:21

请求的 Axios 拦截器在继续请求之前不等待等待<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数调用完成"/>

请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

我有使用 Axios 发出的所有请求的拦截器代码。

instance
这里是 Axios 实例。

instance.interceptors.request.use(async (config) => {
  const tokens = JSON.parse(localStorage.getItem('users'));
  if (!tokens) {
    return config;
  }
  const accessTokenValid = Date.now() <= (tokens?.expirationTime ?? Date.now());
  if (accessTokenValid) {
    return config;
  }
  const refreshToken = tokens.refreshToken;
  if (!refreshToken) { 
    return config;
  }

  const response = await fetch(`${some-endpoint}/auth/refresh/token?token=${refreshToken}`);
  const newTokens = (await response.json()).data.data;

  localStorage.setItem('users', JSON.stringify(
    {
      accessToken: newTokens.access_token,
      expirationTime: Date.now() + parseInt(JSON.parse(newTokens.expires_in)) * 1000 - 600 * 1000,
      refreshToken: newTokens.refresh_token,
    }
  ));

  config.headers.Authorization = `Bearer ${newTokens.access_token}`;

  return config;
}, (error) => {
  console.error(error);
});

那么,

instance
就这样用了

    return instance.get(
      "/users/" + id,
      options
    );

在哪里

options
看起来像这样。

        {
          headers: {
            Authorization: `Bearer ${session.accessToken}`,
          },
        }

上面代码的问题是token过期后第一次请求总是会失败。然后,

localStorage.users
中的值将被更新,第二个请求将成功,因为该值已被新的访问令牌替换。

我不想使用拦截器来响应重试原始请求。我想根据要求处理令牌刷新。经过调查发现 HTTP 请求发生的顺序如下。

  • 对端点的 HTTP 请求
    users
  • 然后,HTTP 请求到端点以刷新令牌

这告诉我请求拦截器中的

async/await
部分不起作用。我怎样才能让 HTTP 请求在运行 HTTP 请求本身之前必须先等待拦截器完成运行(包括等待任何异步函数)?

回答如下:

更多推荐

请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

本文发布于:2024-05-30 17:18:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1770738.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   拦截器   Axios

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!