在Vue單頁面開發過程當中,遇到這樣的狀況,當我切換頁面時,因爲上一頁面請求執行時間長,切換到該頁面時,還未執行完,這時那個請求仍會繼續執行直到請求結束,此時將會影響頁面性能,而且可能對如今頁面的數據顯示形成必定影響vue
因此咱們應該,切換頁面前中斷前面全部請求ios
在main.js中,從新封裝axios請求,在router.beforeEach強制中斷請求ajax
Vue.prototype.$http= axios;
//Vue函數添加一個原型屬性$axios 指向axios,這樣vue實例或組件中不用再去重複引用Axios 直接用this.$axios就能執行axios 方法
const CancelToken = axios.CancelToken; Vue.$httpRequestList=[]; Vue.prototype.$ajax = (type, url, data) => { 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) => { //路由切換檢測是否強行中斷, if(Vue.$httpRequestList.length>0){ //強行中斷時才向下執行 Vue.$httpRequestList.forEach(item=>{ item('interrupt');//給個標誌,中斷請求 }) } next(); });
使用請求json
this.$axios('get',url,param).then(res=>{ }).catch(err=>{ });
axios中文官網(http://www.axios-js.com/zh-cn/docs/)對cancel token 的說明axios
使用cancel token取消請求函數
方法1、使用cancelToken.sourse工廠方法建立cancel tokenpost
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.');
方法2、經過傳遞一個 executor 函數到 CancelToken
的構造函數來建立 cancel token:性能
const CancelToken = axios.CancelToken; let cancel; axios.get('/user/12345', { cancelToken: new CancelToken(function executor(c) { // executor 函數接收一個 cancel 函數做爲參數 cancel = c; }) }); // cancel the request cancel();