我正在向蓝牙设备发送数据,响应由连接过程中设置的侦听器处理:
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解析不能保证正确地绑定到原始请求。一次只能处理一个请求。