返回

React Axios妙用:封装防重复提交,一劳永逸解决重复请求难题

Android

React Axios 封装之旅:轻松实现防重复提交

背景

在前端开发中,重复提交请求是一个常见问题。当用户重复点击按钮或快速发送请求时,可能会导致服务端负荷过高,甚至出现错误。为了避免这种问题,我们可以使用 Axios 来封装请求,并实现防重复提交功能。

Axios 封装步骤

步骤 1:安装 Axios

npm install axios

步骤 2:创建 Axios 实例

const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
});

步骤 3:封装请求函数

const makeRequest = (config) => {
  return axiosInstance(config)
    .then((response) => response.data)
    .catch((error) => {
      if (error.response) {
        // 处理请求失败的情况
      } else if (error.request) {
        // 处理请求未发送的情况
      } else {
        // 处理其他情况
      }
      return Promise.reject(error);
    });
};

防重复提交实现

步骤 4:添加防重复提交功能

let isSubmitting = false;
const makeRequestWithPreventRepeat = (config) => {
  if (isSubmitting) {
    return Promise.reject(new Error('请求正在提交中,请稍后再试'));
  }
  isSubmitting = true;
  return makeRequest(config).finally(() => {
    isSubmitting = false;
  });
};

步骤 5:使用封装后的函数发送请求

makeRequestWithPreventRepeat({
  url: '/users',
  method: 'GET',
})
.then((data) => {
  // 处理请求成功的情况
})
.catch((error) => {
  // 处理请求失败的情况
});

步骤 6:实现 2 秒内禁止重复提交

const makeRequestWithPreventRepeatFor2Seconds = (config) => {
  let timeoutId;
  return new Promise((resolve, reject) => {
    timeoutId = setTimeout(() => {
      isSubmitting = false;
      reject(new Error('请求超時,請稍後再試'));
    }, 2000);
    makeRequestWithPreventRepeat(config)
      .then((data) => {
        clearTimeout(timeoutId);
        resolve(data);
      })
      .catch((error) => {
        clearTimeout(timeoutId);
        reject(error);
      });
  });
};

结论

通过以上步骤,我们可以轻松地使用 Axios 封装请求,并实现防重复提交功能。这种方法简单易用,可根据实际情况进行调整,非常适合在 React 项目中使用。

常见问题解答

Q1:如何处理请求失败的情况?

A:在 makeRequest 函数的 .catch 中,我们可以处理请求失败的情况,例如显示错误信息或重试请求。

Q2:如何限制重复提交的时间范围?

A:在 makeRequestWithPreventRepeatFor2Seconds 函数中,我们可以设置一个超时,并在超时后禁止重复提交。

Q3:如何重置 isSubmitting 标记?

A:在 makeRequestWithPreventRepeat 函数的 .finally 中,我们可以重置 isSubmitting 标记,以便在下一次请求时允许提交。

Q4:为什么需要封装请求函数?

A:封装请求函数可以让我们更方便地管理请求配置和错误处理,并更容易实现防重复提交等功能。

Q5:这种方法是否适用于其他前端框架或库?

A:虽然本教程使用 React,但这种方法可以很容易地应用到其他前端框架或库中,例如 Vue.js 或 Angular。