封装axios 包括取消请求

import axios from 'axios';

const CancelToken = axios.CancelToken;
let cancel;

// 创建axios实例
const instance = axios.create({
  baseURL: 'http://api.example.com',
  timeout: 10000,
});

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 在发送请求前判断请求是否已经被取消,如果是则直接返回一个空的 Promise 对象
    if (cancel) {
      return new Promise(() => {});
    }

    // 添加取消请求的逻辑
    config.cancelToken = new CancelToken(function executor(c) {
      cancel = c;
    });

    // 根据具体情况添加其他请求头参数等操作...
    return config;
  },
  error => {
    console.error(error); 
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 处理正常响应结果
    if (response.status === 200) {
      return response.data;
    }
    return Promise.reject(response);
  },
  error => {
    // 处理响应错误
    const { response } = error;
    if (response.status !== 200) {
      console.error(`Request Error: ${response.data.message}`);
      return Promise.reject(error);
    }
    return Promise.reject(error);
  }
);

export default instance;

使用

import axios from 'axios';

const CancelToken = axios.CancelToken;

// 封装请求 API 的方法
export function fetchData(params) {
  return axios.get('/api/data', {
    params,
    cancelToken: new CancelToken(function executor(c) {
      // 保存 cancel 函数
      window.cancelFetch = c;
    }),
  });
}

// 在使用的页面中调用 API 方法
fetchData({
  page: 1,
  limit: 10,
}).then(response => {
  console.log(response);
}).catch(error => {
  if (axios.isCancel(error)) {
    console.warn('Request Cancelled:', error.message);
  } else {
    console.error(error);
  }
});

// 取消请求
setTimeout(() => {
  window.cancelFetch('Operation Cancelled by User');
}, 500);

在上面的代码中,我们首先把 fetchData() 方法封装到一个单独的 js 文件中,并在其中设置了 cancelToken 参数。通过传入该参数,我们就可以在需要时手动取消请求。在本例中,我们将 cancel 函数保存在全局变量 window.cancelFetch 中,以便在外部调用。当然,这只是一种简单的实现方式,在实际应用中,可能需要更加严谨和灵活的设计。

然后,在使用 API 方法的页面中,我们直接调用 fetchData() 方法并传入对应的参数。在响应拦截器中,我们使用 axios.isCancel() 方法来判断是否是用户手动取消的请求,并在控制台输出相应信息。

最后,在需要取消请求时,我们可以直接调用 window.cancelFetch(‘Operation Cancelled by User’) 来触发 cancel 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值