axios 取消上一个相同的请求

这段代码定义了一个名为httpServices的异步函数,用于封装axios进行HTTP请求。函数支持GET和POST方法,处理了CSRF令牌,具有请求取消功能,并在请求和响应中添加了错误处理。同时,根据请求类型和内容类型适当地序列化数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import qs from 'qs';
import Axios from 'axios';

import getCsrfServices from './getCsrfServices';

async function httpServices(params): Promise<void> {
  const {
    useDefaultErrorHandle = true,
    needCsrf = false,
    requestName,
    contentType,
    ...reqParams
  } = params;
  const { method = 'get', headers = {} } = reqParams;
  const isGet = method.toUpperCase() === 'GET';
  const isPost = method.toUpperCase() === 'POST';
  const reqData = { ...reqParams, method };

  // post 请求默认加上csrf,form请求
  if (isPost) {
    const csrfData = await getCsrfServices();
    if (contentType === 'application/json') {
      reqData.data = {
        ...reqData.data,
        ...csrfData,
      };
    } else {
      reqData.data = qs.stringify({
        ...reqData.data,
        ...csrfData,
      });
    }
    let contentTYPE;
    if (contentType) {
      contentTYPE = contentType;
    } else {
      contentTYPE = 'application/x-www-form-urlencoded';
    }

    reqData.headers = {
      Accept: 'application/json',
      'Content-Type': contentTYPE,
      ...headers,
    };
  }

  if (isGet && needCsrf) {
    const csrfData = await getCsrfServices();

    reqData.params = {
      ...reqData.params,
      ...csrfData,
    };
  }

  const { CancelToken } = Axios;
  let requestNameTemp = '';

  // 取消同一requestName的请求
  Axios.interceptors.request.use((config: any) => {
    if (config && config.requestName) {
      requestNameTemp = config.requestName;

      if (Axios[requestNameTemp] && Axios[requestNameTemp].cancel) {
        Axios[requestNameTemp].cancel();
      }

      // eslint-disable-next-line
      config.cancelToken = new CancelToken((c: any) => {
        Axios[requestNameTemp] = {};
        // 取消请求操作
        Axios[requestNameTemp].cancel = c;
      });
    }

    return config;
  });

  delete reqData.requestName;

  return Axios.request(reqData)
    .then(response => {
      const { status, data = {} } = response;
      const { error, msg, data: resData = {} } = data;

      if (status === 200 && error === 0) {
        return Promise.resolve(resData);
      }

      // 默认使用默认的错误处理,直接弹toast
      if (useDefaultErrorHandle) {
        console.log(msg || '网络错误,请稍后再试~');
      }

      return Promise.reject(data);
    })
    .catch((e = {}) => {
      if (useDefaultErrorHandle) {
         console.log(e.msg || '网络错误,请稍后再试~');
      }
      return Promise.reject(e);
    });
}

export default httpServices;

    httpServices({
      url: '/api',
      method: 'post',
      data: {
        id: 111
      },
      requestName: 'requestName',
    }).then((data = {}) => {
    console.log(data)
    });
在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值