uni-app nvue蓝牙延迟调用uni.readBLECharacteristicValue两次或两次以上报错[JS Framework] Failed to find taskCenter

发布于 1周前 作者 wuwangju 来自 Uni-App

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)  
            }  
        }  
    })  
}

操作步骤:

  1. nvue蓝牙连接成功调用uni.readBLECharacteristicValue无回调。
  2. nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上报错[JS Framework] Failed to find taskCenter。

预期结果:

  1. nvue蓝牙连接成功调用uni.readBLECharacteristicValue后正常返回结果。
  2. nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上结果正常。

实际结果:

  1. nvue蓝牙连接成功调用uni.readBLECharacteristicValue无回调。
  2. nvue蓝牙连接成功后,延迟调用uni.readBLECharacteristicValue,首次成功,关闭页面再进入,或循环调用两次及以上报错[JS Framework] Failed to find taskCenter。

1 回复

uni-app 中使用 nvue 开发时,调用 uni.readBLECharacteristicValue 方法时出现 [JS Framework] Failed to find taskCenter 错误,通常是由于多次调用该方法导致的。这个问题可能与 uni-app 的底层实现或 nvue 的渲染机制有关。

可能的原因

  1. 异步操作未完成:在第一次调用 uni.readBLECharacteristicValue 时,操作尚未完成,又发起了第二次调用,导致任务中心无法正确处理。
  2. 任务中心未初始化nvue 的任务中心可能未正确初始化,导致无法找到任务中心。
  3. 并发调用限制uni.readBLECharacteristicValue 可能不支持并发调用,或者并发调用时会导致任务中心出错。

解决方案

  1. 确保异步操作完成后再调用:在调用 uni.readBLECharacteristicValue 后,等待其回调函数执行完毕后再进行下一次调用。可以使用 Promiseasync/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();
  2. 检查任务中心初始化:确保 nvue 的任务中心已正确初始化。如果问题依然存在,可以尝试在 onLoadonReady 生命周期钩子中初始化任务中心。

  3. 避免并发调用:确保在同一时间内只有一个 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);
            }
        });
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!