- Axios再封装
注解:type:请求类型,url:对应的API,data:请求参数,heaStr:API版本(如v2,v3)
import axios from 'axios'
Vue.prototype.$http= service;
//Vue函数添加一个原型属性$axios 指向axios,这样vue实例或组件中不用再去重复引用Axios 直接用this.$axios就能执行axios 方法
var CancelToken = axios.CancelToken;
Vue.$httpRequestList=[];
Vue.prototype.$axios = (type, url, data,heaStr) => {
if(url!='/api/ding/login'&& url!='/api/integral/types'){
var Accept='';
switch(heaStr){
case 'v2':
Accept='application/vnd.test.v2+json'
break;
case 'v3':
Accept='application/vnd.test.v3+json'
break;
case 'v4':
Accept='application/vnd.test.v4+json'
break;
}
if(getToken()){
return new Promise((resolve, reject) => { //封装ajax
var aa = {
method: type,
url: url,
headers:{
'Accept':Accept
},
cancelToken: new CancelToken(c => { //强行中断请求要用到的
Vue.$httpRequestList.push(c);
})
}
var json = (type == 'get') ? Object.assign(aa, { params: data }) : Object.assign(aa, { data: data });
var ajax = Vue.prototype.$http(json).then(res => {
resolve(res);
}).catch(error => { //中断请求和请求出错的处理
if (error == "interrupt") {
console.log('已中断请求');
return;
} else {
reject(error);
}
})
return ajax;
})
}else{return Promise.reject('无token')}
}else{
return new Promise((resolve, reject) => { //封装ajax
var aa = {
method: type,
url: url,
cancelToken: new CancelToken(c => { //强行中断请求要用到的
Vue.$httpRequestList.push(c);
})
}
var json = (type == 'get') ? Object.assign(aa, { params: data }) : Object.assign(aa, {data: data });
var ajax = Vue.prototype.$http(json).then(res => {
resolve(res);
}).catch(error => { //中断请求和请求出错的处理
if (error.message == "interrupt") {
console.log('已中断请求');
return;
} else {
reject(error);
}
})
return ajax;
})
}
};
router.beforeEach((to, from, next) => { //路由切换检测是否强行中断,
NProgress.start();
if(Vue.$httpRequestList.length>0){ //强行中断时才向下执行
Vue.$httpRequestList.forEach(item=>{
item('interrupt');//给个标志,中断请求
})
}
next();
});
请求终断:当快速切换页面,如果上一页面请求还没响应,跳转到下一个页面,上一页面的请求终止。
cancelToken: new CancelToken(c => { //强行中断请求要用到的
Vue.$httpRequestList.push(c);
})
router.beforeEach((to, from, next) => { //路由切换检测是否强行中断,
NProgress.start();
if(Vue.$httpRequestList.length>0){ //强行中断时才向下执行
Vue.$httpRequestList.forEach(item=>{
item('interrupt');//给个标志,中断请求
})
}
next();
});
实现思路:对axios进行再次封装,统一方式调用,传参。终止请求
文档更新时间: 2021-05-05 17:47 作者:郭家裕