本文参考了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
})
网友评论