还可以做进一步优化:
1、装载所有的请求中数据,初始化为 [] 空数组,
2、在push时,push({'url':***,'cancel':cancelToken})
//像这样存入,当前请求的url和当前的取消方法,形成映射
3、在执行某个改变原始数据源的请求时,为防止前一个还在运行但尚未完成的请求的影响,可以根据
当前url去所有请求未完成的集合中找到它并取消请求,然后从集合中移除该信息
*测试发现,这里的取消,并不是取消请求:因为请求已经发出了,服务器也已经在处理,只是回传消息的时候打上了标记,因此在catch模块输出Cancel
1、前台输出2次
2、后台输出多次
欢迎大家去验证:后台加个Thread.sleep(3000);,可以模拟网络延迟
var vm=new Vue({
el:"#div_id",
data:{
cancelTag:[], //装所有的想要准备移除的请求,用处:当你离开这个页面时,将取消这个页面发出 的未完成的所有请求
cancelCurrentTag:null, //放置的是前一个单独的请求,用处:有时只想对某一个可能未完成的请求,让它取消
},
methods:{
post:function(){ //post请求
var CancelToken = axios.CancelToken; //这里不写,下面new对象那里会报空
axios({
headers: {
'Content-Type': 'application/json'
},
transformRequest: [function(data) { //请求之前,对数据做处理
data = JSON.stringify(data)
return data
}],
timeout:5000,
url: '***',
method: 'post',
//params: {},
data: {
'code': 123, //传的参数
'data': "***"
},
// “cancelToken”指定可用于取消请求的取消令牌
cancelToken: new CancelToken(function (cancel) {
vm.cancelCurrentTag=cancel;
vm.cancelTag.push(cancel); //动态放入
})
}).then(function(res){ //想打出全部数据,可以使用console.log(JSON.stringify(err)),不会会显示object对象,而无法查看具体数据
console.log("请求数据:"+res.data)
}).catch(function(err){
if(err!="Cancel"){ //非代码取消请求造成的异常,才输出显示
console.log("请求异常:"+err)
}
})
},
cancelAll:function(){ //取消之前的全部请求
$.each(this.cancelTag,function(i,item){
console.log("执行了")
item();
})
this.cancelTag=[]; //取消完之后,再清空记录
},
cancel:function(){
console.log("执行")
var j=-1;
this.cancelCurrentTag();
$.each(this.cancelTag,function(i,item){ //既然准备单独取消,就将总体中的该部分移去
if(item==vm.cancelCurrentTag)j=i;
})
if(j!=-1)this.cancelTag.splice(j,1);
}
}
})
*此后,还应该在请求完成后的 成功与非取消的失败中,移除该项cancelTag