小程序无痛刷新token

Posted SeaBoat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序无痛刷新token相关的知识,希望对你有一定的参考价值。

// 封装一个http 方法

let temp_request = [], is_freshing = false;
/**
 * @param {string} url 
 * @param {string} method 
 * @param {Object} data 
 * @param {Boolean} loading 
 */
const http = function(url, method, data, loading) {
    let params_ = arguments
    return new Promise((resolve, reject) => {
        if(loading) {
            uni.showToast({
                title: \'加载中\',
                icon: \'loading\',
                duration: 10000,
                // mask: true
            })
        }
        data.token = uni.getStorageSync(\'api_token\')

        uni.request({
            url: url,
            method,
            data,
            success(res) {
                if(loading){
                    uni.hideToast({
                        title: \'加载中\',
                        icon: \'loading\',
                        duration: 10000,
                    })
                }
                let code = res.data.code
                switch (code) {
                    case 0: resolve(res.data.data);break;
                    case 200: 
                        // other handlers
                        break
                    case 401:
                        // token 过期
                        if(!is_freshing) {
                            refresh()
                        }
                        // 关键步骤~~~~
                        resolve(new Promise(reslove => {
                            temp_request.push(() => {
                                reslove(http(...params_))
                            })
                        }))
                        break;
                    default: 
                        reject(res.data.data)
                }
            },
            fail(error) {
                reject(error.data.data)
            },
            complete(res) {

            }
        })
    })
}

function refresh() {
    is_freshing = true
    // 这里用的uni-app 获取微信code, 原生微信小程序 wx.login()
    uni.login({
        provider: \'weixin\',
        success: function (loginRes) {
            http(\'/mob/auth/login/miniProgram\', \'post\', {code}, true)
            .then((res) => {
                uni.setStorageSync(\'api_token\', res.token)
                is_freshing = false
                temp_request.map(cb => cb())
                // 清空temp_request
                temp_request = []
            })
            .catch((res) => {
                uni.hideLoading();
            })
        }
    });
}
export default http



//  测试

onShow() {
    // 在token过期的情况下,派发三个需要token的请求
    http({url1, \'get\'})
    .then((res) => {
        console.log(res)
    })
    http({url1, \'get\'})
    .then((res) => {
        console.log(res)
    })
    http({url1, \'get\'})
    .then((res) => {
        console.log(res)
    })
}

以上是关于小程序无痛刷新token的主要内容,如果未能解决你的问题,请参考以下文章

配置项目请求地址和axios以及实现token过期无痛刷新

自动刷新android片段,直到满足条件

微信小程序代码片段

重新加载时刷新片段

微信小程序代码片段分享

小程序各种功能代码片段整理---持续更新