let isRefreshing = false 标识当前正在刷新token
// 重试队列,每一项将是一个待执行的函数形式
let requests = []
axios.interceptors.response.use(response => {
const { code } = response.data
if (code === 401) { // 具体code看和后端定义的是什么,这里是401
const config = response.config
if (!isRefreshing) {
isRefreshing = true
const params = new URLSearchParams()
params.append('refreshToken', refresh_token)
return refreshToken(params).then(res => {
if (如果接口没有正常返回token,那么调用退出到登录页面) {
logout()
} else {
/*
在这可以把新token存到store或者localStorage里面,具体的看自己存在哪
*/
config.headers['Authorization'] = 'Bearer ' + token
requests.forEach(cb => cb(token))
requests = []return axios(config)
}
}).catch(res => {
如果服务端异常,那么在这也是退出到登录页面
}).finally(() => {
isRefreshing = false
})
} else {
// 正在刷新token,将返回一个未执行resolve的promise
return new Promise((resolve) => {
// 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
requests.push((token) => {
config.headers['Authorization'] = 'Bearer ' + token
resolve(axios(config))
})
})
}
}
return response
}, error => {
return Promise.reject()
})