小程序无痛刷新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的主要内容,如果未能解决你的问题,请参考以下文章