Vue切換頁面時中斷axios請求

1、概述

在Vue單頁面開發過程當中,遇到這樣的狀況,當我切換頁面時,因爲上一頁面請求執行時間長,切換到該頁面時,還未執行完,這時那個請求仍會繼續執行直到請求結束,此時將會影響頁面性能,而且可能對如今頁面的數據顯示形成必定影響vue

因此咱們應該,切換頁面前中斷前面全部請求ios

2、解決方法

 在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=>{

});

 

3、分析解讀

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();
相關文章
相關標籤/搜索