从单独的回调中获取 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 决议不能保证与原始请求正确绑定。这一次只能处理一个请求。
我正在向蓝牙设备发送数据,响应由在连接过程中设置的侦听器处理:
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 决议不能保证与原始请求正确绑定。这一次只能处理一个请求。