es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
}
Tags:  , , , ,

Answer

  1. Avatar for 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ón device.read() es asíncrona y, por lo tanto, el console.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 llamada dataReceived, 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 de nodehid indica que existe device.readSync(), pero el autor no pudo averiguar cómo usarlo.

Comments are closed.