From 7b620210a24c38dc11ed3f85149f573132849cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Wed, 10 Dec 2025 00:35:15 +0800 Subject: [PATCH] 1 --- src/game_pages/detail/index.tsx | 3 ++- src/store/userStore.ts | 47 ++++++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/game_pages/detail/index.tsx b/src/game_pages/detail/index.tsx index c93baec..a65a3e8 100644 --- a/src/game_pages/detail/index.tsx +++ b/src/game_pages/detail/index.tsx @@ -79,7 +79,8 @@ function Index() { }); // 位置更新后,重新获取详情页数据(因为距离等信息可能发生变化) - await fetchDetail(); + // 注意:这里不调用 fetchDetail,避免与 useDidShow 中的调用重复 + // 如果需要更新距离信息,可以在 fetchDetail 成功后根据当前位置重新计算 if (from === "publish") { handleShare(true); } diff --git a/src/store/userStore.ts b/src/store/userStore.ts index 1f5d3a9..5c22707 100644 --- a/src/store/userStore.ts +++ b/src/store/userStore.ts @@ -15,7 +15,7 @@ export interface UserState { fetchUserInfo: () => Promise; updateUserInfo: (userInfo: Partial) => void; nicknameChangeStatus: Partial; - checkNicknameChangeStatus: () => void; + checkNicknameChangeStatus: (force?: boolean) => void; updateNickname: (nickname: string) => void; // NTRP 测试结果缓存 lastTestResult: LastTimeTestResult | null; @@ -32,6 +32,10 @@ const getTimeNextDate = (time: string) => { return `${year}-${month}-${day}`; }; +// 请求锁,避免重复调用 +let isFetchingLastTestResult = false; +let isCheckingNicknameStatus = false; + export const useUser = create()((set) => ({ user: {}, fetchUserInfo: async () => { @@ -87,8 +91,20 @@ export const useUser = create()((set) => ({ } }, nicknameChangeStatus: {}, - checkNicknameChangeStatus: async () => { + checkNicknameChangeStatus: async (force = false) => { + // 如果正在请求中,直接返回,避免重复调用 + if (isCheckingNicknameStatus) { + return; + } + // 如果已经有状态数据且不是强制更新,跳过,避免重复调用 + if (!force) { + const currentState = useUser.getState(); + if (currentState.nicknameChangeStatus && Object.keys(currentState.nicknameChangeStatus).length > 0) { + return; + } + } try { + isCheckingNicknameStatus = true; const res = await checkNicknameChangeStatusApi(); const { next_period_start_time } = res.data; set({ @@ -99,12 +115,15 @@ export const useUser = create()((set) => ({ }); } catch (error) { console.error("检查昵称变更状态失败:", error); + } finally { + isCheckingNicknameStatus = false; } }, updateNickname: async (nickname) => { try { await updateNicknameApi(nickname); - await useUser.getState().checkNicknameChangeStatus(); + // 更新昵称后强制更新状态 + await useUser.getState().checkNicknameChangeStatus(true); set((state) => ({ user: { ...state.user, nickname }, })); @@ -115,7 +134,27 @@ export const useUser = create()((set) => ({ // NTRP 测试结果缓存 lastTestResult: null, fetchLastTestResult: async () => { + // 如果已经有缓存数据,直接返回,避免重复调用 + const currentState = useUser.getState(); + if (currentState.lastTestResult) { + return currentState.lastTestResult; + } + // 如果正在请求中,等待请求完成,避免重复调用 + if (isFetchingLastTestResult) { + // 等待请求完成,最多等待 3 秒 + let waitCount = 0; + while (isFetchingLastTestResult && waitCount < 30) { + await new Promise((resolve) => setTimeout(resolve, 100)); + waitCount++; + const state = useUser.getState(); + if (state.lastTestResult) { + return state.lastTestResult; + } + } + return null; + } try { + isFetchingLastTestResult = true; const res = await evaluateService.getLastResult(); if (res.code === 0) { set({ lastTestResult: res.data }); @@ -125,6 +164,8 @@ export const useUser = create()((set) => ({ } catch (error) { console.error("获取NTRP测试结果失败:", error); return null; + } finally { + isFetchingLastTestResult = false; } }, }));