fix(connectedDevice): 连接后等 SN 到位再绑定,拿不到 SN 时断开重置

- 连接成功后同时监听 deviceConnect 与 deviceInfo,两个信号都到位才调绑定接口,避免空 SN 绑定
- 15 秒超时仍拿不到 SN 时断开连接、清缓存、重置页面状态

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
17792275749
2026-08-28 11:38:52 +08:00
co-authored by Claude Opus 4.7
parent 4d39449a0d
commit b4b2d2c7f3
@@ -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()
})
},