// 是否正在刷新的标记
let isRefreshing = false
// 重试队列,每一项将是一个待执行的函数形式
let requests = []
// 在请求之后拦截 自定义处理结果 可根据前后端定义的
/* 对响应成功做点什么 可使用async await 做异步操作*/
httpRequest.interceptors.response.use(
({ data, config }) => {
const code=String(data.code)
console.log(data,"请求返回的结果",config);
uni.hideLoading()
switch (code) {
case '20001':
// 正常返回
return data
break;
case 'U0231':
//用户ACCESS_TOKEN已过期
if(!isRefreshing){
//没有换token
isRefreshing = true
const refreshToken = storage.get('refresh_token')
let param = {
clientId: 'login-client',
clientSecret: 'login-client-admin',
grantType: 'refresh_token',
licenseId: 1,
refreshToken
}
return VoHttp.login(param).then(res=>{
store.dispatch('user/setUseInfo', res.data)
console.log(requests,"requestsrequestsrequests")
// 已经刷新了token,将所有队列中的请求进行重试
requests.forEach(cb => cb(refreshToken))
// 重试完了别忘了清空这个队列(掘金评论区同学指点)
requests = []
//重新请求
return httpRequest.request(config)
}).catch(err=>{
}).finally(()=>{
isRefreshing=false
})
}else{
// 正在刷新token,返回一个未执行resolve的promise
return new Promise((resolve) => {
// 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
requests.push((token) => {
console.log(token)
resolve(httpRequest.request(config))
})
})
}
break
case 'U0230':
//用户登录已过期
store.dispatch('user/setUserInfo',{})
break
default:
return Promise.reject(data)
break
}
},
(response) => {
console.log(response,"responseresponse")
return Promise.reject(response)
},
)
axios如何利用promise无痛刷新token
最新推荐文章于 2024-06-06 09:00:19 发布