从单独的回调中获取 Promise resolve

Get Promise resolve from separate callback

我正在向蓝牙设备发送数据,响应由在连接过程中设置的侦听器处理:

device.connect().then(device => {
  device.registerResponseListener((data) => {
    // handle response
  }
}

我有一个单独的函数可以将数据发送到设备:

const sendData = (device, data) => {
  device.write(data);
}

我的问题是,我如何 Promisify 这段代码?我希望能够做到

const sendData = (device, data) => {
  return new Promise((resolve, reject) => {
    device.write(data);
    // resolve...?
  });
}

但是如何让 resolve 进入蓝牙响应侦听器?

我不知道你用的是什么 API,但你可以试试 BluetoothRemoteGATTCharacteristic API。它具有 return Promise.

的 writeValueWithResponse 方法

https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTCharacteristic

如果我理解正确的话,你可以这样做

const sendData = async (device, data) => {
  const response = await device.write(data);
  await Promise.all(device.responseListeners.map(listener => listener(response)))
}

在这种情况下,虽然仍然不理想,但最好的解决方案是将 resolve 函数存储在更高范围的变量中:

var sendDataResolve;

device.connect().then(device => {
  device.registerResponseListener((data) => {
    sendDataResolve(data);
  }
}

const sendData = (device, data) => {
  return new Promise((resolve, reject) => {
    sendDataResolve = resolve;
    device.write(data);
  });
}

...

sendData(device, "data")
.then(result => {
  console.log("Got result",result);
});

需要注意的是,Promise 决议不能保证与原始请求正确绑定。这一次只能处理一个请求。