axios 防止重復提交全局統一攔截


axios 全局統一攔截

參看 https://zacharykwan.com/2018/05/22/%E9%85%8D%E5%90%88%20axios%20%E5%AE%9E%E7%8E%B0%E9%98%B2%E9%87%8D%E6%8F%90%E4%BA%A4/

 

let pending = []; //聲明一個數組用於存儲每個ajax請求的取消函數和ajax標識
let cancelToken = axios.CancelToken;
let removePending = (config) => {
    for(let p in pending){
        if(pending[p].u === config.url + '&' + config.method) { //當當前請求在數組中存在時執行函數體
            pending[p].f(); //執行取消操作
            pending.splice(p, 1); //把這條記錄從數組中移除
        }
    }
}
 
//添加請求攔截器
axios.interceptors.request.use(config=>{
     removePending(config); //在一個ajax發送前執行一下取消操作
     config.cancelToken = new cancelToken((c)=>{
        // 這里的ajax標識我是用請求地址&請求方式拼接的字符串,當然你可以選擇其他的一些方式
        pending.push({ u: config.url + '&' + config.method, f: c });  
    });
     return config;
   },error => {
     return Promise.reject(error);
   });
 
//添加響應攔截器
axios.interceptors.response.use(response=>{
      removePending(res.config);  //在一個ajax響應后再執行一下取消操作,把已經完成的請求從pending中移除
      return response;
   },error =>{
      return { data: { } }; 返回一個空對象,否則控制台報錯
   });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM