Estoy enviando datos al dispositivo de destino usando device.sendReport(reportID, dataBuffer) de WebHID , pero trato de leer la respuesta antes de que esté lista (es decir), la respuesta tarda en generarse.
Por ahora, al configurar el tiempo de espera de 10 ms, puedo obtener la respuesta. Me gustaría saber si hay alguna solución mejor para esto.
No ha dicho cómo el dispositivo proporciona la respuesta, pero supongo que tiene la forma de un informe de entrada. En ese caso, la Promise devuelta por sendReport() no es particularmente interesante, sino que desea escuchar un evento de inputreport de entrada que se activará en HIDDevice . Si quieres puedes convertir esto en una Promise como esta,
const response = new Promise((resolve) => { device.addEventListener('inputreport', resolve, { once: true }); }); await device.sendReport(...your data...); const { reportId, data } = await response; Una vez recibida la respuesta se almacenará en data .
Tenga en cuenta que esto supone que el dispositivo solo genera informes de entrada en respuesta a una solicitud. Para un dispositivo con comunicaciones más complejas, es posible que desee tener un inputreport eventos de informe de entrada registrado en todo momento y procesar los informes de entrada en función de su ID de informe u otros factores. HID no admite ninguna contrapresión, por lo que si no tiene un inputreport eventos de informe de entrada registrado cuando el dispositivo envía un informe, se descartará.
Para este tipo de acción, debe usar código asíncrono. Al enviar/recibir cosas hacia o desde un servidor, esta acción es una 'Promesa' que es asíncrona.
Se verá así (usando la API fetch como ejemplo):
Con devoluciones de llamada (que son opcionales)
myFunction = () => { fetch('POST', data) .then((response) => { console.log(response); }) .catch((error) => { console.warn(error); }); }Con asíncrono/espera. Esto no se recomienda en la mayoría de los casos, ya que se supone que la solicitud tendrá éxito.
myFunction = async () => { const response = await fetch('POST', data); console.log(response); }