axios+async/await无痛刷新token

2020-04-02  本文已影响0人  扶不起的蝌蚪

本文参考了axios如何利用promise无痛刷新token,并在此基础上采用await/async 封装,具体的原理可以看那篇文章,本文只是利用await使其看起来更像同步的方法。
使用了这位大神编写的的uni-axios插件
运行中发现你的APP如果token过期了,如果

let isRefreshing = false
let requests = []
http.interceptors.response.use(async response => {
    //toekn过期处理 
    if (response.data.code == -401)
    {
        let {config} = response
        if (!isRefreshing)
        {
            isRefreshing = true
            let userInfo = uni.getStorageSync('userInfo')
            let [,res] = await http.post('/api/security/token',{
                username: userInfo.account,
                password: userInfo.password
            })
            //说明web端修改了密码,让app跳转到登录页重新登录
            if(res.data.status == -2)
            {   
                //关闭请求的遮罩
                uni.hideLoading()
                uni.showToast({
                    icon: "none",
                    title: "登录信息过期,请重新登录!",
                    duration:3000
                })
                uni.removeStorageSync('userInfo')
                uni.reLaunch({url: '../login/login'});
                isRefreshing = false
                requests = []
                return
            }
            //否则保存新的token
            let token = res.data.token
            userInfo.token = token
            uni.setStorageSync('userInfo', userInfo)
            requests.forEach(cb => cb())
            requests = []
            isRefreshing = false
            return http.request(config)
        } 
        else
        {
            return new Promise((resolve) => {
                requests.push(() => {
                    resolve(http.request(config))
                })
            })
        }
    }
    if (response.data.status == -2)
    { 
        uni.showToast({
            icon: "none",
            title: "密码错误!"
        })
        return Promise.reject(response)
    }
    console.log(response);
    return response
}, err => { 
    console.log(err);
    uni.showToast({
        icon: 'none',
        position: 'bottom',
        title: `服务器异常,请联系管理员`
    })
    return err
})
上一篇 下一篇

猜你喜欢

热点阅读