Estoy enviando datos a un dispositivo Bluetooth y las respuestas son manejadas por un oyente que se configura durante el proceso de conexión:
device.connect().then(device => { device.registerResponseListener((data) => { // handle response } }Tengo una función separada que envía datos al dispositivo:
const sendData = (device, data) => { device.write(data); }Mi pregunta es, ¿cómo puedo prometer este código? me gustaria poder hacer
const sendData = (device, data) => { return new Promise((resolve, reject) => { device.write(data); // resolve...? }); } Pero, ¿cómo obtengo la resolve en el oyente de respuesta de Bluetooth?
No sé qué API está utilizando, pero puede probar la API BluetoothRemoteGATTCharacteristic. Tiene el método writeValueWithResponse que devuelve Promise.
https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTCaracterística
La mejor solución posible en este caso, aunque aún no es la ideal, fue almacenar la función de resolve en una variable de mayor alcance:
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); });La advertencia es que NO se garantiza que las resoluciones de Promise se vinculen correctamente a la solicitud original. Esto SÓLO funciona con una solicitud a la vez.
Si te entendí bien entonces puedes hacerlo así
const sendData = async (device, data) => { const response = await device.write(data); await Promise.all(device.responseListeners.map(listener => listener(response))) }