axios取消请求与避免重复请求
本文介绍在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相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
配置 Matter.js 睡眠机制以优化静止物体性能
2026-11-05 15:43:12
JavaScript console.log高级用法:用table、group和time优化调试输出
2026-11-05 08:04:56
JS变量中存储HTML代码时的特殊字符转义方法
2026-11-04 19:04:09
JS怎么安全转换带千分位或货币符号的字符串为数字
2026-11-04 11:54:14
推荐几款稳定的在线JS反混淆工具,支持Obfuscator.io解密
2026-11-04 08:16:21
