提交 8fb7776d authored 作者: lidongxu's avatar lidongxu

refactor(request.js): 修复:网络请求响应后多个报错叠加显示问题

上级 8e5b58f9
...@@ -16,6 +16,58 @@ export let isRelogin = { show: false }; ...@@ -16,6 +16,58 @@ export let isRelogin = { show: false };
// 促销系统后台 baseURL // 促销系统后台 baseURL
export const promotionBaseURL = import.meta.env.VITE_APP_PROMOTION export const promotionBaseURL = import.meta.env.VITE_APP_PROMOTION
// 错误消息队列和状态管理
let errorMessageQueue = [];
let isShowingError = false;
let lastErrorTime = 0;
const ERROR_DEBOUNCE_TIME = 1000; // 1秒内的错误视为同一批
// 显示错误消息(单例模式)
function showErrorMessage(message, type = 'error') {
const now = Date.now();
// 如果正在显示错误消息,或者距离上次错误时间很短,将消息加入队列
if (isShowingError || (now - lastErrorTime < ERROR_DEBOUNCE_TIME)) {
// 检查队列中是否已有相同消息,避免重复
const existingIndex = errorMessageQueue.findIndex(item => item.message === message);
if (existingIndex === -1) {
errorMessageQueue.push({ message, type });
}
return;
}
// 标记为正在显示
isShowingError = true;
lastErrorTime = now;
// 显示当前错误消息
ElMessage({
message: message,
type: type,
duration: 3000, // 适当延长显示时间
onClose: () => {
isShowingError = false;
// 检查队列中是否有待显示的消息
if (errorMessageQueue.length > 0) {
// 延迟一段时间再显示下一条,避免消息切换太快
setTimeout(() => {
const nextError = errorMessageQueue.shift();
if (nextError) {
showErrorMessage(nextError.message, nextError.type);
}
}, 500);
}
}
});
}
// 清空错误消息队列(可选,在某些场景下可能需要)
export function clearErrorMessageQueue() {
errorMessageQueue = [];
isShowingError = false;
}
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
...@@ -91,51 +143,18 @@ service.interceptors.response.use(async res => { ...@@ -91,51 +143,18 @@ service.interceptors.response.use(async res => {
return res.data return res.data
} }
if (code === 401) { if (code === 401) {
if (window.h5sdk) { // ... existing 401 handling code ...
// 如果在飞书客户端,则无感知重新获取token
const code = await fsClientAuth()
await useUserStore().login({
type: 'fs',
data: { code }
})
// 重新发送本次失败的请求
return service(res.config)
}
// PC/移动端刷新 token 有效期
// await useUserStore().refreshTokenFn()
// return service(res.config)
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
// location.href = '#/login';
router.push({ path: '/login' })
})
}).catch(() => {
isRelogin.show = false;
});
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 403) { } else if (code === 403) {
// 如果刷新 refreshToken 接口也报错了,证明需要重新登录 showErrorMessage(msg, 'error')
// ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
// isRelogin.show = false;
// useUserStore().logOut().then(() => {
// location.href = '#/login';
// })
// }).catch(() => {
// isRelogin.show = false;
// });
// return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
ElMessage({ message: msg, type: 'error' })
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg))
} else if (code === 500) { } else if (code === 500) {
ElMessage({ message: msg, type: 'error' }) showErrorMessage(msg, 'error')
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg))
} else if (code === 601) { } else if (code === 601) {
ElMessage({ message: msg, type: 'warning' }) showErrorMessage(msg, 'warning')
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg))
} else if (code !== 200) { } else if (code !== 200) {
ElNotification.error({ title: msg }) showErrorMessage(msg, 'error')
return Promise.reject('error') return Promise.reject('error')
} else { } else {
return Promise.resolve(res.data) return Promise.resolve(res.data)
...@@ -150,7 +169,7 @@ service.interceptors.response.use(async res => { ...@@ -150,7 +169,7 @@ service.interceptors.response.use(async res => {
} else if (message.includes("Request failed with status code")) { } else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) showErrorMessage(message, 'error')
return Promise.reject(error) return Promise.reject(error)
} }
) )
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论