let isRefreshing = false;
let failedQueue: Array<{
resolve: (value?: any) => void;
reject: (reason?: any) => void;
config: AxiosRequestConfig;
}> = [];
const processQueue = (error: any, token: string | null = null) => {
failedQueue.forEach(({ resolve, reject, config }) => {
if (error) {
reject(error);
} else if (token) {
config.headers = {
...config.headers,
Authorization: token
};
resolve(request(config));
}
});
failedQueue = [];
};
request.interceptors.response.use(
(response: CustomAxiosResponse<Result>) => {
if (response.config?.resInterceptors) {
return response.config.resInterceptors(response);
}
const res = response.data;
if (res.result === "NO_LOGIN") {
return Promise.reject(res.resultMsg);
}
if (res.result === "Failure") {
message.error(res.resultMsg || "API调用错误");
return Promise.reject(res.resultMsg);
}
return Promise.resolve(res);
},
async (error: any) => {
const { response } = error;
const originalRequest = error.config;
if (response?.status === 401 && !originalRequest._retry) {
if (isRefreshing) {
return new Promise((resolve, reject) => {
failedQueue.push({
resolve,
reject,
config: originalRequest
});
});
}
originalRequest._retry = true;
isRefreshing = true;
try {
const refreshToken = useSystemStore().refreshToken;
const newToken = await refreshTokenAPI(refreshToken);
useSystemStore().setAuthorization(newToken);
processQueue(null, newToken);
originalRequest.headers.Authorization = newToken;
return request(originalRequest);
} catch (refreshError) {
processQueue(refreshError, null);
return Promise.reject(refreshError);
} finally {
isRefreshing = false;
}
}
message.error(showMessage(response?.code));
return Promise.reject(error || { code: "999", msg: "API调用错误" });
}
);