From b4b2d2c7f3f70ac755795e5e73391ae6f7147d8e Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Fri, 28 Aug 2026 11:38:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(connectedDevice):=20=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=90=8E=E7=AD=89=20SN=20=E5=88=B0=E4=BD=8D=E5=86=8D=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=EF=BC=8C=E6=8B=BF=E4=B8=8D=E5=88=B0=20SN=20=E6=97=B6?= =?UTF-8?q?=E6=96=AD=E5=BC=80=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 连接成功后同时监听 deviceConnect 与 deviceInfo,两个信号都到位才调绑定接口,避免空 SN 绑定 - 15 秒超时仍拿不到 SN 时断开连接、清缓存、重置页面状态 Co-Authored-By: Claude Opus 4.7 --- .../pages/connectedDevice/connectedDevice.ts | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/miniprogram/pages/connectedDevice/connectedDevice.ts b/miniprogram/pages/connectedDevice/connectedDevice.ts index 7094ef4..115c968 100644 --- a/miniprogram/pages/connectedDevice/connectedDevice.ts +++ b/miniprogram/pages/connectedDevice/connectedDevice.ts @@ -34,6 +34,7 @@ let connectCleanup: { timer: number | null unsubState: (() => void) | null unsubConnect: (() => void) | null + unsubInfo: (() => void) | null } | null = null /** 一次性防重入标记 */ let modalLocked = false @@ -169,6 +170,7 @@ Page({ if (connectCleanup.timer !== null) clearTimeout(connectCleanup.timer) connectCleanup.unsubState?.() connectCleanup.unsubConnect?.() + connectCleanup.unsubInfo?.() connectCleanup = null }, @@ -305,19 +307,42 @@ Page({ leFuService.connect(scanned.raw) this._clearConnectCleanup() - connectCleanup = { timer: null, unsubState: null, unsubConnect: null } + connectCleanup = { timer: null, unsubState: null, unsubConnect: null, unsubInfo: null } const finish = () => { if (connectCleanup?.timer !== null) clearTimeout(connectCleanup.timer) connectCleanup?.unsubState?.() connectCleanup?.unsubConnect?.() + connectCleanup?.unsubInfo?.() connectCleanup = null wx.hideLoading() } + // 连接成功 + SN 到位两个信号都满足才调接口,各自事件独立触发、顺序不定 + let connected = false + let sn: string | undefined + const tryBind = () => { + if (!connected || !sn) return + finish() + // 手动/自动连接:绑定设备成功后缓存设备并跳配网 + this._bindDevice(sn, () => { + wx.setStorageSync('connectDeviceInfo', { ...scanned.raw, scaleDeviceName: scanned.raw.name }) + wx.navigateTo({ url: '/pages/connectedWifi/connectedWifi' }) + }) + } + connectCleanup.timer = setTimeout(() => { finish() - wx.showToast({ title: '连接超时', icon: 'none' }) + if (connected) { + // 已连上但一直没拿到 SN:断开并重置,避免设备残留占用连接 + leFuService.disconnect() + wx.removeStorageSync('connectDeviceInfo') + scannedDevices = [] + this.setData({ status: 'idle', deviceList: [] }) + wx.showToast({ title: '设备信息异常,请重试', icon: 'none' }) + } else { + wx.showToast({ title: '连接超时', icon: 'none' }) + } }, 15000) connectCleanup.unsubState = leFuService.onConnectState((state) => { @@ -331,13 +356,14 @@ Page({ }) connectCleanup.unsubConnect = leFuService.onDeviceConnect(() => { - finish() - const sn = leFuService.deviceInfo?.serialNumber - // 手动/自动连接:绑定设备成功后缓存设备并跳配网 - this._bindDevice(sn ?? '', () => { - wx.setStorageSync('connectDeviceInfo', { ...scanned.raw, scaleDeviceName: scanned.raw.name }) - wx.navigateTo({ url: '/pages/connectedWifi/connectedWifi' }) - }) + connected = true + sn = leFuService.deviceInfo?.serialNumber + tryBind() + }) + + connectCleanup.unsubInfo = leFuService.onDeviceInfo((info) => { + sn = info?.serialNumber + tryBind() }) },