// 配置axios攔截器 import axios from 'axios'; import store from '../store'; // 追加token import {Bus} from "../service/bus"; // import router from '../router' // 路由跳轉 // 創建axios實例 const clearTimeoutByUrl = (url, requestList) => { for (let item in requestList) { if (url === requestList[item]['url']) { clearTimeout(requestList[item]['timeId']); } } } const service = axios.create({ // baseURL: process.env.VUE_APP_URL, // 接口可能會分模塊調用 所以不做全局配置 timeout: 50000 // 請求超時時間 }); // request攔截器,在請求之前做一些處理 service._requestCount = 0; // 累加請求次數 service._requestTimeIdList = []; service.interceptors.request.use( config => { service._requestCount++; // 如果接口請求小於200ms的話 那么就不顯示loading const timeId = setTimeout(() => { store.commit('handleLoading', true);// 顯示loading }, 200); service._requestTimeIdList.push({ timeId: timeId, url: config.url }); return config }, error => { Promise.reject(error) } ) // response 攔截器,數據返回后進行一些處理 service.interceptors.response.use( response => { service._requestCount--; // clear 200ms 后准備展示的loading clearTimeoutByUrl(response.config.url, service._requestTimeIdList); if (service._requestCount <= 0) { store.commit('handleLoading', false); } const res = response.data; return res; }, (error) => { service._requestCount--; clearTimeoutByUrl(error.config.url, service._requestTimeIdList); if (service._requestCount <= 0) { // 當全部的接口請求完畢后 關閉loading store.commit('handleLoading', false);// 隱藏loading } Bus.showDefaultToast({ showClose: true, message: '請求出錯! 請稍后重試!', type: 'error', duration: 0 }) Promise.reject('異常', error); } ) export default service