axios 拦截器与取消 pending 状态请求
import axios from 'axios'
import { Notification } from 'element-ui'
import router from '../router/index.js'
const gotoLoginPage = function () {
setTimeout(() => {
router.replace(`/login?redirect=${encodeURIComponent(location.pathname + location.search)}`)
}, 1000)
}
axios.defaults.timeout = 5000
axios.defaults.withCredentials = true
const allPendingRequestsRecord = []
function getUniqueId (config) {
return `url=${config.url}&method=${config.method}`
}
function removePendingRequestRecord (config) {
allPendingRequestsRecord.some((item, index) => {
if (item.id === getUniqueId(config)) {
item.cancel()
allPendingRequestsRecord.splice(index, 1)
return true
}
})
}
export function removeAllPendingRequestsRecord () {
allPendingRequestsRecord.forEach((item) => {
item.cancel('page changes')
})
allPendingRequestsRecord.splice(0)
}
axios.interceptors.request.use(
config => {
if (config.method === 'get') {
config.url = config.url + '?' + new Date().getTime()
}
config.url = `${config.url}?uniqueCancel_${Math.random().toString(36).substr(2)}`
config.cancelToken = new axios.CancelToken(function executor (cancel) {
allPendingRequestsRecord.push({ id: getUniqueId(config), cancel })
})
return config
},
error => {
Promise.reject(error)
}
)
axios.interceptors.response.use(
res => {
if (res.status === 200 && res.data.code === 307) {
removeAllPendingRequestsRecord()
Notification.info({
title: '消息',
message: '登录失效,请重新登录'
})
localStorage.removeItem('menus')
localStorage.removeItem('buttons')
sessionStorage.removeItem('isLoadNodes')
gotoLoginPage()
return Promise.reject(res)
}
removePendingRequestRecord(res.config)
if (!res.data) {
return Promise.reject(res)
}
return res
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '错误信息:' + '请求参数错误'
break
case 401:
error.message = '未登录'
removeAllPendingRequestsRecord()
gotoLoginPage()
break
case 402:
error.message = '错误信息:您还没有该路径的访问权限'
break
case 404:
error.message = '错误信息:请求地址出错'
break
case 500:
error.message = 'message:' + error.response.data.message + ',exception:' + error.response.data.exception
break
case 502:
error.message = '错误信息:网关错误'
break
case 504:
error.message = '错误信息:网关超时'
break
default:
}
Notification({
title: '错误码:' + error.response.status,
dangerouslyUseHTMLString: true,
message: error.message,
type: 'error'
})
}
removePendingRequestRecord(error.response.config)
return Promise.reject(error)
}
)
const axiosPlugin = {
install (Vue) {
Vue.prototype.$http = axios
Vue.prototype.$base = '/commonApi'
Vue.prototype.$mock = '/mockApi'
}
}
export default axiosPlugin