javascript streamreader отображает только второй фрагмент в #log-box.append

Я изо всех сил пытаюсь изучить JQuery/Javascript, и у меня есть веб-приложение, использующее хромированный "экспериментальный" веб-интерфейс API. Когда я ввожу команду и получаю ответ, эта строка разбивается на 2 части в случайном месте, обычно в первой трети:

<p0><iDCC-EX V-0.2.1 / MEGA / STANDARD_MOTOR_SHIELD G-9db6d36>

Все остальные ответные сообщения короче и заключены в скобки "<" и ">".

В коде ниже. В окне журнала всегда отображается только второй фрагмент, даже в подпрограмме ChunkTransformer(), которая одновременно правильно отображает его в журнале консоли devtools.

Как я могу получить все мои ответные сообщения в виде одной строки? Это нормально, если фрагменты разделены квадратными скобками как отдельные возвращаемые значения, пока они отображаются в журнале. я думаю <p0>не отображается, потому что окно журнала считает, что это специальный символ. Он даже не будет отображаться здесь, пока я не заверну в тег кода. Так что я думаю, что у меня есть как минимум две проблемы.

async function connectServer() {
        try{         
            port = await navigator.serial.requestPort(); // prompt user to select device connected to a com port
            await port.open({ baudRate: 115200 });         // open the port at the proper supported baud rate

            // create a text encoder output stream and pipe the stream to port.writeable
            const encoder = new TextEncoderStream();
            outputDone = encoder.readable.pipeTo(port.writable);
            outputStream = encoder.writable;
            // send a CTRL-C and turn off the echo
            writeToStream('\x03', 'echo(false);');

            let decoder = new TextDecoderStream();
            inputDone = port.readable.pipeTo(decoder.writable);
            inputStream = decoder.readable
            // test why only getting the second chunk in the log
            .pipeThrough(new TransformStream(new ChunkTransformer()));
            
            // get a reader and start the non-blocking asynchronous read loop to read data from the stream.
            reader = inputStream.getReader();
            readLoop();
            return true;
        } catch (err) {
            console.log("User didn't select a port to connect to")
            return false;
        }
}

async function readLoop() {
    while (true) {
        const { value, done } = await reader.read();
        if (value) {
            displayLog(value);
        }
        if (done) {
            console.log('[readLoop] DONE'+done.toString());
            displayLog('[readLoop] DONE'+done.toString());
            reader.releaseLock();
            break;
        }
    }
}

class ChunkTransformer {
    transform(chunk, controller) {
        displayLog(chunk.toString()); // only shows last chunk!
        console.log('dumping the raw chunk', chunk); // shows all chunks
        controller.enqueue(chunk);
    }
}

function displayLog(data){
    $("#log-box").append("<br>"+data+"<br>");
    $("#log-box").animate({scrollTop: $("#log-box").prop("scrollHeight"), duration: 1}, "fast");
}

1 ответ

Решение

Первый шаг: измените функцию displayLog() одним из следующих способов.

С Animate:

       function displayLog(data){
  $("#log-box").append("<br>"+data+"<br>");
  $("#log-box").animate({scrollTop: $("#log-box").prop("scrollHeight")}, "fast");
}

Без Animate:

       function displayLog(data){
    $("#log-box").append("<br>"+data+"<br>");
    $("#log-box").scrollTop( $("#log-box").prop("scrollHeight"));
}

ИЛИ Просто для вашего понимания:

       function displayLog(data){
    $("#log-box").append("<br>"+data+"<br>");
    scrollHeight =  $("#log-box").prop("scrollHeight");
    $("#log-box").scrollTop(scrollHeight);
}
Другие вопросы по тегам