工具
- luch-request
- pinia
思路
- 请求前拦截放开拦截
- 在请求后401拦截处理
- 通过设定标识
isRefreshing 来判断是否在请求中拦截添加队列 requestList
- 通过await阻塞token请求过程
- 循环执行
requestList
- 重新本次发送请求
实例
import Request from 'luch-request';
import { useUserStore } from '@s/user';
const http = new Request({
baseURL:'/api'
timeout: 15000,
header: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
http.interceptors.request.use(async (config) => {
const store = useUserStore();
config.header = {
...config.header,
Authorization: 'Bearer ' + store.accessToken,
};
return config;
});
let isRefreshing = false;
let requestList = [];
http.interceptors.response.use(
async (response) => {
return Promise.resolve(response.data);
},
async (error) => {
console.log('-> error', error);
let { config } = error;
const userStore = useUserStore();
if (error.statusCode == 401) {
if (!isRefreshing) {
isRefreshing = true;
console.log('开始刷新token');
await userStore.login(userStore.token.refresh_token);
requestList.forEach((cb) => cb());
console.log('执行完成');
requestList = [];
isRefreshing = false;
return http.request(config);
} else {
return new Promise((resolve) => {
requestList.push(() => {
resolve(http.request(config));
});
});
}
}
return Promise.reject(error);
},
);
export default http;