Web Bluetooth多Characteristic声明及读写问题排查
核心错误点
你的代码存在两个基础逻辑问题,和Next.js/React框架无关,不需要额外引入类封装即可修复:
service.getCharacteristic()是异步方法,返回Promise对象。你连续调用该方法时没有等待所有异步请求执行完成,直接返回的是未resolve的Promise对象,不是实际可用的特征实例。- 你使用了JS逗号操作符写返回值:
return (shdn, heart_rate_measurement, temperature_measurement, stim, battery),该语法最终只会返回括号内最后一个值(即battery实例),前面的所有特征实例都会被丢弃,所以后续.then中你命名为shdn的参数实际是电池特征,调用写入方法自然会报错。
修复代码
使用Promise.all并行等待所有特征加载完成,再以对象形式返回所有实例,避免顺序错乱和值丢失:
.then(async (service) => { pushlog("Getting all required Characteristics..."); // 并行拉取所有需要的特征,等待全部请求完成 const [ heart_rate_measurement, temperature_measurement, shdn, stim, battery ] = await Promise.all([ service.getCharacteristic("heart_rate_measurement"), service.getCharacteristic("temperature_measurement"), service.getCharacteristic("33ca7a02-c95f-4bca-a8bb-6692930216d0"), service.getCharacteristic("b71ce29e-7353-40bf-a4dd-b0c03593e0ba"), service.getCharacteristic("battery_level") ]); // 返回对象存储所有特征实例,后续按需取用 return { shdn, heart_rate_measurement, temperature_measurement, stim, battery }; })
后续调用对应特征时,从返回的对象中解构出需要的实例即可:
.then(({ shdn }) => { pushlog("Writing to Shutdown Characteristic..."); const resetEnergyExpended = Uint8Array.of(0x01); return shdn.writeValue(resetEnergyExpended); }) // 需要使用其他特征时同理解构即可 .then(({ heart_rate_measurement, battery }) => { // 在这里写心率、电池特征的通知监听、读写逻辑即可 })
如果你不想使用async/await语法,直接给Promise.all传入所有getCharacteristic返回的Promise实例,在.then里拿到按顺序排列的特征数组再返回即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Dionysus
相关产品推荐
相关产品推荐

