axios取消请求与避免重复请求

作者:安全边界时间:2026-10-24 12:26:43浏览:68

本文介绍在vue-element-admin项目中,利用axios的CancelToken机制手动取消请求,并通过全局Map存储请求标识来避免长耗时接口覆盖快速接口的重复请求问题,确保数据展示准确。

背景介绍

在业务场景中,某些页面需要下载全量数据。由于数据量庞大,接口响应时间较长,容易引发后续问题。

另一些页面在加载初始数据时耗时较长,但单个检索操作响应迅速。若用户在初始数据加载期间发起检索,检索接口先返回结果,随后初始数据才返回并覆盖检索结果,导致前端展示的数据出现错误。

针对上述情况,我们需要实现以下功能:

  • 支持手动取消或终止正在进行的Request请求。
  • 确保特定页面的接口在同一时刻仅允许存在一个活跃的请求。

当前现状

本系统基于vue-element-admin开源项目进行二次开发,底层请求库采用axios。其封装的request.js文件中的关键代码如下:


// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  withCredentials: true, // send cookies when cross-domain requests
  timeout: 500000, // request timeout
  transformRequest: [function(data) {
    // 对 data 进行任意转换处理
    return Qs.stringify({
      ...data
    },
    // 数组的转换
    { arrayFormat: 'brackets' })
  }]
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

以下是发起请求的核心方法实现:


export function remoteApi(data) {
  return request({
    url: '/api',
    method: 'post',
    data
  })
}

关于取消请求,axios提供了CancelToken机制。

根据官方文档,取消请求的方式如下:


const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
     // 处理错误
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

对原有请求方法进行改造后的代码如下:


export function remoteApi(data, cancelToken) {
  return request({
    url: '/api',
    method: 'post',
    cancelToken,
    data
  })
}

在实际发起请求时,需要创建CancelToken实例:


// 组件方法内
this.cancelToken = CancelToken.source()
remoreApi(data, this.cancelToken).then(....).catch(....).finally(....)

当需要取消请求时,执行以下操作:


// 组件方法内
this.cancelToken.cancel('取消下载')

避免重复请求策略

为了防止长耗时接口返回的数据覆盖快速接口的结果,从而造成数据显示错误,我们需要避免同一接口的重复请求。实现思路较为直观:使用一个全局Map来存储请求标识与对应的CancelToken。在发起新请求前,根据请求标识获取之前未完成的CancelToken并调用其cancel方法,随后再发出新请求,即可满足防重复请求的需求。

总结

至此,关于axios取消请求与避免重复请求的介绍已完成。如需了解更多axios相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!

作者最新文章