上个月,微信看到了一篇提到前端无感刷新token的问题,刚好项目中有这个场景,就想着实践并且记录一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
let isRefreshing = false;
let requests = [];
service.interceptors.response.use(response => { }, error => { const option = error.config const responseObj = error.response; switch (responseObj.status) { case 401: if (!isRefreshing) { isRefreshing = true; refreshToken().then(res => { if (res.success) { utils.setStorage('accessToken', res.data.accessToken); utils.setStorage('refreshToken', res.data.refreshToken);
requests.forEach(item => item(res.data.accessToken));
setTimeout(() => { requests = []; }, 0) } else { return Promise.reject(new Error(res.errMsg)); } }).catch(err => { return Promise.reject(err); }).finally(() => { isRefreshing = false; }) }
return new Promise(resolve => { requests.push(token => { reslove(service({ type: option.type, data: option.type !== 'GET' && !isFormData(option.data) ? JSON.parse(option.data) : option.data, url: option.url.replace(/Authorization=([^\&]+)/, () => 'Authorization=' + token), headers: { ...option.headers, Authorization: 'bearer ' + token } })) }) })
default: break; } })
|