uni-app nvue蓝牙延迟调用uni.readBLECharacteristicValue两次或两次以上报错[JS Framework] Failed to find taskCenter
uni-app nvue蓝牙延迟调用uni.readBLECharacteristicValue两次或两次以上报错[JS Framework] Failed to find taskCenter
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Mac | 13.4 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
PC开发环境操作系统版本号:版本13.4 (22F66)
HBuilderX类型:正式
HBuilderX版本号:3.8.12
手机系统:Android
手机系统版本号:Android 14
手机厂商:三星
手机机型:SM-G9900
页面类型:nvue
vue版本:vue3
打包方式:云端
示例代码:
uni.onBLEConnectionStateChange(({ deviceId, connected }) => {
if (connected) {
setTimeout(() => {
readDeviceInfo(0)
}, 2000);
}
})
const readDeviceInfo = (times: number) => {
uni.readBLECharacteristicValue({
deviceId: connectionDevice.value?.deviceId ?? '',
serviceId: DeviceInfoServer.SERVER_UUID,
characteristicId: DeviceInfoServer.READ_PNP_ID,
fail: () => {
if (times < retry) {
readDeviceInfo(times + 1)
} else {
changePairingDeviceConnect(3)
}
}
})
}
操作步骤:
- nvue蓝牙连接成功调用uni.readBLECharacteristicValue无回调。
- nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上报错[JS Framework] Failed to find taskCenter。
预期结果:
- nvue蓝牙连接成功调用uni.readBLECharacteristicValue后正常返回结果。
- nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上结果正常。
实际结果:
- nvue蓝牙连接成功调用uni.readBLECharacteristicValue无回调。
- nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上报错[JS Framework] Failed to find taskCenter。
在 uni-app
中使用 nvue
开发时,调用 uni.readBLECharacteristicValue
方法时出现 [JS Framework] Failed to find taskCenter
错误,通常是由于多次调用该方法导致的。这个问题可能与 uni-app
的底层实现或 nvue
的渲染机制有关。
可能的原因
- 异步操作未完成:在第一次调用
uni.readBLECharacteristicValue
时,操作尚未完成,又发起了第二次调用,导致任务中心无法正确处理。 - 任务中心未初始化:
nvue
的任务中心可能未正确初始化,导致无法找到任务中心。 - 并发调用限制:
uni.readBLECharacteristicValue
可能不支持并发调用,或者并发调用时会导致任务中心出错。
解决方案
-
确保异步操作完成后再调用:在调用
uni.readBLECharacteristicValue
后,等待其回调函数执行完毕后再进行下一次调用。可以使用Promise
或async/await
来确保顺序执行。async function readCharacteristicValue(deviceId, serviceId, characteristicId) { return new Promise((resolve, reject) => { uni.readBLECharacteristicValue({ deviceId, serviceId, characteristicId, success: resolve, fail: reject }); }); } async function readMultipleTimes() { try { await readCharacteristicValue(deviceId, serviceId, characteristicId); await readCharacteristicValue(deviceId, serviceId, characteristicId); // 可以继续调用更多次 } catch (error) { console.error('读取特征值失败:', error); } } readMultipleTimes();
-
检查任务中心初始化:确保
nvue
的任务中心已正确初始化。如果问题依然存在,可以尝试在onLoad
或onReady
生命周期钩子中初始化任务中心。 -
避免并发调用:确保在同一时间内只有一个
uni.readBLECharacteristicValue
调用在进行。可以通过加锁机制或状态管理来避免并发调用。let isReading = false; function readCharacteristicValue(deviceId, serviceId, characteristicId) { if (isReading) { console.warn('正在读取特征值,请稍后再试'); return; } isReading = true; uni.readBLECharacteristicValue({ deviceId, serviceId, characteristicId, success: () => { isReading = false; console.log('读取特征值成功'); }, fail: (error) => { isReading = false; console.error('读取特征值失败:', error); } }); }