本文參考了axios如何利用promise無痛刷新token,并在此基礎(chǔ)上采用await/async 封裝沼本,具體的原理可以看那篇文章,本文只是利用await使其看起來更像同步的方法郊丛。
使用了這位大神編寫的的uni-axios插件
運(yùn)行中發(fā)現(xiàn)你的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跳轉(zhuǎn)到登錄頁重新登錄
if(res.data.status == -2)
{
//關(guān)閉請(qǐng)求的遮罩
uni.hideLoading()
uni.showToast({
icon: "none",
title: "登錄信息過期,請(qǐng)重新登錄!",
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: "密碼錯(cuò)誤!"
})
return Promise.reject(response)
}
console.log(response);
return response
}, err => {
console.log(err);
uni.showToast({
icon: 'none',
position: 'bottom',
title: `服務(wù)器異常,請(qǐng)聯(lián)系管理員`
})
return err
})