|
|
@@ -342,19 +342,38 @@ async function loadMonth(month) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 记录当前在飞的 daily 请求 AbortController,切换日期时取消上一个
|
|
|
+let dailyAbortController = null;
|
|
|
+
|
|
|
async function selectDate(date) {
|
|
|
+ // 切换日期前:取消上一个还在飞的请求,避免它的结果覆盖新选中日期的数据
|
|
|
+ if (dailyAbortController) {
|
|
|
+ dailyAbortController.abort();
|
|
|
+ dailyAbortController = null;
|
|
|
+ }
|
|
|
+ const controller = new AbortController();
|
|
|
+ dailyAbortController = controller;
|
|
|
selectedDate.value = date;
|
|
|
try {
|
|
|
const user = getCurrentUser() || currentUser || {};
|
|
|
const userId = (user && user.raw && user.raw.userId) || (user && user.raw && user.raw.id) || (user && user.id) || "";
|
|
|
- const result = await queryDailyAttendance(userId, date);
|
|
|
+ const result = await queryDailyAttendance(userId, date, { signal: controller.signal });
|
|
|
+ // 期间用户又切到别的日期了,丢弃这次响应
|
|
|
+ if (controller.signal.aborted) return;
|
|
|
// 后端未返回数据(null/undefined)→ 显式清空,
|
|
|
// 否则 record 卡片会继续展示上一个日期的记录,与 selectedDate 不同步
|
|
|
dailyDetail.value = result || null;
|
|
|
} catch (error) {
|
|
|
+ // 主动取消:不弹 toast、不清数据(可能已经被新请求覆盖)
|
|
|
+ if (error?.name === 'AbortError' || controller.signal.aborted) return;
|
|
|
// 接口异常时也清空,避免 toast 提示完之后 record 卡片还停在旧数据
|
|
|
dailyDetail.value = null;
|
|
|
uni.showToast({ title: error.message || "日期详情加载失败", icon: "none" });
|
|
|
+ } finally {
|
|
|
+ // 只清掉自己的 controller,避免覆盖掉期间已经开始的新请求
|
|
|
+ if (dailyAbortController === controller) {
|
|
|
+ dailyAbortController = null;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|