NodeJS читаемых потоков - PullRequest
       30

NodeJS читаемых потоков

0 голосов
/ 06 апреля 2020

У меня есть такой случай, когда при создании потока через fs.createReadStream и использовании событий readable и read(SIZE), чтобы потреблять его, мой поток время от времени застревает. Иногда в stream.readableLength есть еще несколько байтов, но читаемые события не генерируются, и я не могу полностью прочитать поток. Что я делаю не так?

Пример:

const myStream = fs.createReadStream('my-file', { highWaterMark = 1024 });

myStream.on('readable', () => {
  const chunk = myStream.read(1500);

  if (chunk !== null) {
    // DO SOME SYNC OR ASYNC ACTIONS
  }
})

1 Ответ

1 голос
/ 06 апреля 2020

В целом, использование события data и предоставление потоку такой возможности доставить вам все данные проще и с меньшей вероятностью могут привести к проблемам. Это было бы моей рекомендацией, если только нет очень конкретной c причины, по которой вам нужно использовать событие readable и читать данные самостоятельно.

Когда вы используете событие readable и myStream.read(), у вас есть читать все, что есть, пока вы не получите null назад из чтения, указывающего, что буфер сейчас пуст. В противном случае вы застрянете в ожидании следующего события readable, которое не наступит. От do c для .read() он говорит следующее:

В то время как l oop необходимо при обработке данных с readable.read (). Только после того, как readable.read () вернет null, будет «readable».


Вот простая демонстрация. Просто укажите это на большой файл (скажем, 100 КБ):

const fs = require('fs');

let stream = fs.createReadStream("vlc-help.txt");

stream.on('readable', () => {
    let data = stream.read(10)
    console.log(data);
});

Когда я запускаю его, указывая на файл размером 343 080 байт, я вижу такой вывод:

<Buffer ef bb bf 55 73 61 67 65 3a 20>
<Buffer 76 6c 63 20 5b 6f 70 74 69 6f>

Я только получить два читаемых события, а затем он останавливается.


Когда я вставляю рекомендуемое while() l oop, например:

const fs = require('fs');

let stream = fs.createReadStream("vlc-help.txt");

stream.on('readable', () => {
    let data;
    while (data = stream.read(10)) {
        console.log(data);
    }
});

Я получаю длинный поток данные, пока весь файл не будет прочитан.

...