您的位置:首页 > 移动开发 > IOS开发

axios取消重复请求

2018-09-03 14:11 886 查看

axios官网文档上取消请求的两种方式

使用CancelToken.source工厂创建一个取消令牌:

[code]var CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 处理错误
}
});
//取消请求(消息参数是可选的)
source.cancel('操作被用户取消。');

还可以通过将执行器函数传递给CancelToken构造函数来创建取消令牌:

[code]var CancelToken = axios.CancelToken;
var cancel;

axios.get('/ user / 12345',{
cancelToken:new CancelToken(function executor(c){
//一个执行器函数接收一个取消函数作为参数
cancel = c;
})
});

// 取消请求
clear();

根据文档上的第二种方法,我们可以在拦截器里统一处理取消重复请求

[code]let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken;
let removePending = (config) => {
for(let p in pending){
if(pending

.u === config.url + '&' + config.method) { //当当前请求在数组中存在时执行函数体 pending[p].f(); //执行取消操作 pending.splice(p, 1); //把这条记录从数组中移除 } } } //添加请求拦截器 axios.interceptors.request.use(config=>{ removePending(config); //在一个ajax发送前执行一下取消操作 config.cancelToken = new cancelToken((c)=>{ // 这里的ajax标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式 pending.push({ u: config.url + '&' + config.method, f: c }); }); return config; },error => { return Promise.reject(error); }); //添加响应拦截器 axios.interceptors.response.use(response=>{ removePending(res.config); //在一个ajax响应后再执行一下取消操作,把已经完成的请求从pending中移除 return response; },error =>{ return { data: { } }; 返回一个空对象,主要是防止控制台报错 });

[p]效果

同一个请求,没有完成的请求将被取消

 

未完成的ajax被取消

结论

利用这个方法,一方面可以防止重复点击不同页码导致的表格数据闪烁,另外可以做实时搜索,始终获取最新结果。



作者:大田角
链接:https://www.jianshu.com/p/4445595488e2
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: