From 1818e01b5788f2a281cd50c0a7d22cf16e65669d Mon Sep 17 00:00:00 2001 From: dzq Date: Fri, 19 Sep 2025 16:29:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(wx):=20=E7=A1=AE=E4=BF=9D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=A4=84=E7=90=86=E5=AE=8C=E6=88=90=E5=90=8E?= =?UTF-8?q?=E5=86=8D=E8=8E=B7=E5=8F=96=E5=BA=97=E9=93=BA=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 isHandleWxCallbackComplete 状态和 waitForHandleWxCallbackComplete 方法 在 ProductList.vue 中等待微信回调处理完成后再获取店铺列表 --- src/pages/product/ProductList.vue | 8 ++++++-- src/pinia/stores/wx.ts | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/pages/product/ProductList.vue b/src/pages/product/ProductList.vue index 31c5534..f2236ab 100644 --- a/src/pages/product/ProductList.vue +++ b/src/pages/product/ProductList.vue @@ -61,11 +61,13 @@ function handleShopSelect(selectedShopId: number) { // 组件挂载时添加滚动监听 -onMounted(() => { +onMounted(async () => { const urlParams = new URLSearchParams(window.location.search); const shopIdParam = urlParams.get('shopId') || undefined; if (showShopList.value) { + // 等待 handleWxCallback 完成 + await wxStore.waitForHandleWxCallbackComplete(); getShopListApi(wxStore.corpid).then((res) => { if (res?.code === 0 && res?.data?.length > 0) { shopList.value = res.data; @@ -95,9 +97,11 @@ function handleCheckout() { } // 路由更新时刷新数据 -watch(() => route.path, (newPath) => { +watch(() => route.path, async (newPath) => { if (newPath === '/') { if (showShopList.value) { + // 等待 handleWxCallback 完成 + await wxStore.waitForHandleWxCallbackComplete(); getShopListApi(wxStore.corpid).then((res) => { if (res?.code === 0 && res?.data?.length > 0) { shopList.value = res.data; diff --git a/src/pinia/stores/wx.ts b/src/pinia/stores/wx.ts index 3ef2bc7..a205709 100644 --- a/src/pinia/stores/wx.ts +++ b/src/pinia/stores/wx.ts @@ -33,6 +33,8 @@ export const useWxStore = defineStore("wx", () => { const ab98User = ref(null); const isFakeQyLogin = ref(false); + // handleWxCallback 是否完成 + const isHandleWxCallbackComplete = ref(false); // 设置 openid const setOpenid = (id: string) => { @@ -78,6 +80,7 @@ export const useWxStore = defineStore("wx", () => { const handleWxCallback = async (params: { corpid?: string; code?: string; state?: string; }) => { console.log('handleWxCallback:', params) + isHandleWxCallbackComplete.value = false; // 开始处理,标记为未完成 if (params.code) { code.value = params.code state.value = params.state || state.value @@ -134,8 +137,12 @@ export const useWxStore = defineStore("wx", () => { } } catch (err) { console.error('获取 openid 失败:', err) + } finally { + isHandleWxCallbackComplete.value = true; // 处理完成,标记为已完成 } + } else { + isHandleWxCallbackComplete.value = true; // 没有code参数,直接标记为已完成 } } @@ -155,11 +162,24 @@ export const useWxStore = defineStore("wx", () => { } } + // 检测 handleWxCallback 是否完成的异步函数 + const waitForHandleWxCallbackComplete = async (timeout = 30000): Promise => { + const startTime = Date.now(); + while (!isHandleWxCallbackComplete.value) { + if (Date.now() - startTime > timeout) { + console.warn('等待 handleWxCallback 完成超时'); + return false; + } + await new Promise(resolve => setTimeout(resolve, 100)); // 每100ms检查一次 + } + return true; + } + return { code, state, openid, corpid, userid, balance, useBalance, balanceLimit, isCabinetAdmin, corpidLogin, name, ab98User, qyUserId, isFakeQyLogin, - setOpenid, setBalance, handleWxCallback, setIsCabinetAdmin, refreshBalance, setAb98User, - fakeQyLogin } + isHandleWxCallbackComplete, setOpenid, setBalance, handleWxCallback, setIsCabinetAdmin, + refreshBalance, setAb98User, fakeQyLogin, waitForHandleWxCallbackComplete } }) /**