Convirtiendo una función asincrónica de un paquete a sincrónica
Esta función recorre todas las matrices de un teclado, solicita al teclado el keycode en cada lugar y lo agrega al array layerKeycodes. El problema es que device.read() es asíncrono y no encontré una forma de hacerlo sincrónico sin tener un código muy desordenado. El problema es que el console.log() al final (que se devolverá en producción) se activa antes de que el teclado responda y envíe los keycodes. Sé que existe device.readSync() pero la documentación de nodehid es mala, no pude encontrar cómo usarlo.
const getLayerKeycodes = (keyboard, layer, rows, columns) => {
//array que almacena todos los keycodes según su orden
let layerKeycodes = [];
//las filas y columnas comienzan la cuenta en 0 en el nivel inferior, por lo que necesitamos restar uno al número real.
columns--;
rows--;
//bucle que pregunta sobre todos los keycodes en un layer
const dataReceived = (err, data) => {
if (err) {
return err;
}
//agrega el keycode actual al array
// El keycode siempre se devuelve como el quinto objeto.
layerKeycodes.push(data[5]);
console.log(layerKeycodes);
};
for (let r = 0, c = 0; c <= columns; r++) {
//callback que se activa una vez que se recibe información del teclado.
if (r > rows) {
c++;
//r se convertirá en 0 una vez que se active el continue y el bucle se ejecute nuevamente
r = -1;
continue;
}
//Comienza a escuchar y llama a dataReceived cuando se reciba información
keyboard[0].read(dataReceived);
//Solicita al teclado información sobre el keycode
//[siempre 0 (el primer byte se ignora), siempre 0x04 (get_keycode), layer solicitado, fila que se está verificando, columna que se está verificando]
keyboard[0].write([0x01, 0x04, layer, r, c]);
}
console.log(layerKeycodes);
}
davy.ai
Pregunta
¿Cuál es el problema con la función
getLayerKeycodes
y cómo ha intentado solucionarlo el autor?Respuesta
El problema con la función
getLayerKeycodes
es que la funcióndevice.read()
es asíncrona y, por lo tanto, elconsole.log()
al final de la función se ejecuta antes de que el teclado envíe los códigos de tecla. El autor intentó resolver este problema utilizando la función de devolución de llamadadataReceived
, que se activa una vez que se reciben los datos del teclado. Sin embargo, el autor admite que no pudo encontrar una forma de hacer que la función sea síncrona sin que resulte en un código desordenado. La documentación denodehid
indica que existedevice.readSync()
, pero el autor no pudo averiguar cómo usarlo.