axios如何利用promise无痛刷新token

// 是否正在刷新的标记
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)
  },
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值