从单独的回调中获取承诺解析



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

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

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

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

我的问题是,我如何保证这段代码?我希望我能做

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

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

我不知道你在使用什么API,但你可以尝试BluetoothRemoteGATTCharacteristic API。它有writevalewithresponse方法返回Promise。

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解析不能保证正确地绑定到原始请求。一次只能处理一个请求。

最新更新