fetch实现JWT无感刷新
const isRefreshing = false
const requests = []
const getCurrentJwt = async () => {
try {
const res = await getBcCurrentJWT()
B3SStorage.set('bc_jwt_token', res)
return res
} catch (error) {
console.log(error)
}
}
const refresh = async (path, init) => {
if (!isRefreshing) {
isRefreshing = true
try {
const token = await getCurrentJwt()
const reInit = {
headers: {
...init.headers,
Authorization: `Bearer ${token}`,
},
method: init.method,
body: init.body,
}
requests.forEach(item => item(token))
isRefreshing = false
return b3Fetch(path, reInit)
} catch (error) {
removeToken()
router.push('/login')
isRefreshing = false
}
} else {
return new Promise(resolve => {
requests.push(token => {
const reInit = {
headers: {
...init.headers,
Authorization: `Bearer ${token}`,
},
method: init.method,
body: init.body,
}
resolve(b3Fetch(path, reInit))
})
})
}
}
const b3Fetch = (path, init) => {
window.fetch.then(res => res.text()).then(async (data) => {
if (data.code === 409) {
refresh(path, init)
}
})
}