fix(connectedDevice): 连接后等 SN 到位再绑定,拿不到 SN 时断开重置
- 连接成功后同时监听 deviceConnect 与 deviceInfo,两个信号都到位才调绑定接口,避免空 SN 绑定 - 15 秒超时仍拿不到 SN 时断开连接、清缓存、重置页面状态 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
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()
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user