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 函数。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐