为何writeValue不返回Promise?Web Bluetooth模拟写入问题求助
Web Bluetooth
writeValue 不返回Promise问题的解决方案 问题原因
BluetoothRemoteGATTCharacteristic.writeValue是Web Bluetooth API的废弃同步方法,它执行后不会返回Promise,直接调用.then()自然会因为返回值为undefined触发TypeError: Cannot read properties of undefined (reading 'then')。
替代方案
直接使用Web Bluetooth规范中定义的现代异步方法,这两个方法均返回Promise,完全符合你的需求:
writeValueWithResponse: 写入数据后等待设备的确认响应,适合需要确保数据已被接收的场景writeValueWithoutResponse: 无需等待设备响应,写入后立即resolve,适合对传输速度要求高的场景
代码修改示例
替换为writeValueWithResponse(推荐需要确认的场景)
const str2ab = (value: string) => { // 字符串转ArrayBuffer的实现示例 const encoder = new TextEncoder(); return encoder.encode(value); } let chunk = "my message"; let txCharacteristic: BluetoothRemoteGATTCharacteristic; // 使用返回Promise的标准方法 txCharacteristic .writeValueWithResponse(str2ab(chunk)) .then(() => { // 写入成功后的逻辑 console.log("数据写入完成并得到设备确认"); }) .catch((error) => { // 处理写入失败 console.error("写入失败:", error); });
或者使用async/await写法(更简洁)
async function writeData() { try { await txCharacteristic.writeValueWithResponse(str2ab(chunk)); console.log("数据写入完成并得到设备确认"); } catch (error) { console.error("写入失败:", error); } } writeData();
若无需设备确认,使用writeValueWithoutResponse
txCharacteristic .writeValueWithoutResponse(str2ab(chunk)) .then(() => { console.log("数据已发出"); }) .catch((error) => { console.error("发送失败:", error); });
兼容旧方法的包装方案(不推荐,仅作补充)
如果因特殊限制必须处理旧版writeValue,可以手动将其包装为Promise,但优先推荐使用上述标准异步方法:
function writeValuePromise(characteristic, value) { return new Promise((resolve, reject) => { try { characteristic.writeValue(value); resolve(); } catch (error) { reject(error); } }); } // 使用包装后的方法 writeValuePromise(txCharacteristic, str2ab(chunk)) .then(() => { // 逻辑处理 }) .catch((error) => { console.error(error); });
内容的提问来源于stack exchange,提问作者cllmmclu
相关产品推荐
相关产品推荐

