You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:30:51