返回

Axios请求重试的实现技巧

前端

使用Axios 实现请求重试:拦截器 vs 适配器

在与服务器交互时,网络故障或服务器问题在所难免。为了确保应用程序的健壮性和可靠性,实施请求重试机制至关重要。Axios提供了两种实现此功能的方案:拦截器和适配器。本文将深入探讨这两种方法的实施细节、优缺点以及最佳应用场景。

基于拦截器的请求重试

拦截器提供了一种强大的方式,让我们可以在请求发送前后执行自定义操作。我们可以利用拦截器轻松实现请求重试功能。

步骤:

  1. 注册请求拦截器: 在请求发送前执行。
  2. 在拦截器中实现重试逻辑: 检查请求配置,并在需要时修改配置。
  3. 在拦截器中捕获错误并重试: 如果请求失败,检查重试次数并重新发送请求。

代码示例:

axios.interceptors.request.use((config) => {
  if (config.retry === undefined) {
    config.retry = 3;
  }
  return config;
});

axios.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.config && error.config.retry > 0) {
      error.config.retry--;
      return axios(error.config);
    }
    return Promise.reject(error);
  }
);

基于适配器的请求重试

适配器允许我们自定义请求的发送方式。通过创建自定义适配器,我们可以实现请求重试功能。

步骤:

  1. 创建自定义适配器: 接收请求配置并返回一个Promise。
  2. 将自定义适配器注册到Axios: 指定为默认适配器。
  3. 在自定义适配器中实现重试逻辑: 发送请求并处理重试。

代码示例:

const customAdapter = (config) => {
  return new Promise((resolve, reject) => {
    if (config.retry === undefined) {
      config.retry = 3;
    }
    fetch(config.url, config)
      .then((response) => {
        if (response.ok) {
          resolve(response);
        } else {
          if (config.retry > 0) {
            config.retry--;
            return customAdapter(config);
          } else {
            reject(new Error(`请求失败:${response.status} ${response.statusText}`));
          }
        }
      })
      .catch((error) => {
        if (config.retry > 0) {
          config.retry--;
          return customAdapter(config);
        } else {
          reject(error);
        }
      });
  });
};

axios.defaults.adapter = customAdapter;

拦截器与适配器的优缺点对比

方案 优点 缺点
拦截器 - 使用简单 - 可能影响其他拦截器
适配器 - 完全自定义 - 实现复杂

最佳应用场景

  • 拦截器: 当需要在整个应用程序中实现统一的请求重试行为时,建议使用拦截器。
  • 适配器: 当需要针对特定请求进行高级自定义或实现复杂重试逻辑时,建议使用适配器。

常见问题解答

1. 为什么需要请求重试?
请求重试有助于提高应用程序的健壮性,减少由于临时网络故障或服务器问题导致的请求失败。

2. 哪种方法更好,拦截器还是适配器?
这取决于应用程序的具体需求和复杂性。拦截器更简单,而适配器更灵活。

3. 如何配置重试次数?
重试次数可以通过请求配置中的 retry 属性进行配置。如果未指定,则默认值为 3。

4. 重试会一直持续吗?
不会,重试将根据配置的 retry 次数进行。

5. 请求重试会影响性能吗?
是的,请求重试可能会增加请求时间。因此,重要的是权衡请求重试的优点和缺点,并仅在必要时使用它。