刷新token队列管理
刷新token队列管理
// 刷新token方法
// 为了处理同时多个接口要刷新token的控制器
const refreshTokenCache = {
// 是否正在刷新token
isRefreshToken: false as boolean,
// 当正在进行的token刷新时,后来的请求都存放在这个数组中,刷新token后再执行,传入token是否刷新成功
cbList: [] as ((isSuccess: boolean) => void)[],
}
// 供外部调用的刷新token的方法
async function refreshToken(): Promise<boolean> {
return new Promise<boolean>(async resolve => {
// 直接把promise的resolve推入缓存数组中,等token刷新完成后,会依次执行
refreshTokenCache.cbList.push(resolve)
// 发现正在进行刷新token,直接返回
if (refreshTokenCache.isRefreshToken) return
// 设定为正在进行刷新token
refreshTokenCache.isRefreshToken = true
// 刷新token是否成功
let isSuccess = false
try {
// ...调用刷新token的接口
isSuccess = true
} catch (error: any) {
isSuccess = false
}
// 处理所有等待刷新token完后的方法
while (refreshTokenCache.cbList.length) {
// 这里每一个cb方法,都是一个resolve,去执行就行
let cb = refreshTokenCache.cbList.shift()
// 把token刷新的结果传入
cb?.(isSuccess)
}
// 设定为没有在刷新token
refreshTokenCache.isRefreshToken = false
// 刷新token失败,进行错误处理
if (!isSuccess) {
// 一般可以在这里弹一个登录过期请重新登录的提示
// 然后清除token、用户数据等,然后跳转到登录页
}
})
}Last updated