- 封装拦截器防重复提交
import axios from 'axios';
axios.defaults.timeout = 5000;
axios.defaults.baseURL ='';
let pending = [];
let cancelToken = axios.CancelToken;
let removePending = (ever) => {
for(let p in pending){
if(pending[p].u === ever.url + '&' + ever.method) {
pending[p].f();
pending.splice(p, 1);
}
}
}
axios.interceptors.request.use(
config => {
config.data = JSON.stringify(config.data);
config.headers = {
'Content-Type':'application/x-www-form-urlencoded'
}
removePending(config);
config.cancelToken = new cancelToken((c)=>{
pending.push({ u: config.url + '&' + config.method, f: c });
});
return config;
},
error => {
return Promise.reject(err);
}
);
axios.interceptors.response.use(
response => {
removePending(res.config);
if(response.data.errCode ==2){
router.push({
path:"/login",
querry:{redirect:router.currentRoute.fullPath}
})
}
return response;
},
error => {
return Promise.reject(error)
}
)
- tab栏切换时取消请求
get的cancelToken放置在第二个参数的对象里面,post的cancelToken放置在第三个参数对象里面
<body>
<div class="page" id="app">
<button @click="getMsg" class="get-msg">获取数据</button>
<button @click="cancelGetMsg" class="cancel">取消获取</button>
<ul>
<li v-for="item in items">{{item.name}}</li>
</ul>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
items: [],
cancel: null
},
methods: {
getMsg () {
let CancelToken = axios.CancelToken
let self = this
axios.get('http://jsonplaceholder.typicode.com/comments', {
cancelToken: new CancelToken(function executor(c) {
self.cancel = c
console.log(c)
})
}).then(res => {
this.items = res.data
}).catch(err => {
console.log(err)
})
setTimeout(function () {
self.cancel()
}, 100)
},
cancelGetMsg () {
this.cancel()
}
}
})
</script>
</body>
axios取消接口请求