NodeJS, читаемый поток, отправляет сразу большие объемы данных

#node.js #stream

#node.js #поток

Вопрос:

Я пытаюсь реализовать читаемый поток. Источник данных — это инструмент измерения, который при запуске выдает много данных. Я пытаюсь одновременно передавать большие объемы данных в моей реализации _read (size). Когда я начинаю измерение и откладываю поток, так что у меня уже есть больше данных, чем во внутреннем буфере, я получаю странное поведение.

  • Я пытаюсь отправить данные запрошенного размера -> ошибка, нужно немного уменьшить его (в моем случае 32)
  • Даже если первое нажатие выполнено успешно, интерфейс снова вызывает _read (размер), когда я пытаюсь ввести запрошенный размер, я получаю ошибку. Внутренний буфер все еще заполнен.
  • Когда я запускаю поток до того, как объем данных превысит размер внутреннего буфера, все работает.

Вот мой код:

   _read(size) {
    var bytesAvailible = this._tool.getCurrentAddress() - this._offset;
    var bufferStatus = this._readableState.highWaterMark - this._readableState.length -32;
    var bytesToRead = Math.min(bytesAvailible, size - 32);
    console.log("Cur Addr: ", this._tool.getCurrentAddress().toString(16),
      " hwm: ", this._readableState.highWaterMark,
      " length: ", this._readableState.length,
      " bytesAvailible: ", bytesAvailible,
      " size requested: ", size);
    var chunk = getData(this._offset, bytesToRead);

    if (!this.push(chunk)) {
      console.log("Error pushing.");
      return;
    } else {
      console.log("Pushed address:  ", (this._offset).toString(16), " - ",(this._offset   chunk.length).toString(16), " Size: ", chunk.length);
      this._offset  = bytesToRead; // set offset to next address not read;
    }
  }  

И вот результат:

 Cur Addr:  2000ef20  hwm:  16384  length:  0  bytesAvailible:  61216  size requested:  16384
Pushed address:   20000000  -  20003fe0  Size:  16352
Cur Addr:  2000ef40  hwm:  16384  length:  16352  bytesAvailible:  44896  size requested:  16384
Error pushing.
Cur Addr:  2000ef80  hwm:  16384  length:  16352  bytesAvailible:  44960  size requested:  16384
Error pushing.
Cur Addr:  2000efa0  hwm:  16384  length:  16352  bytesAvailible:  44992  size requested:  16384
Error pushing.
Cur Addr:  20010140  hwm:  16384  length:  32704  bytesAvailible:  49504  size requested:  16384
Error pushing.
Cur Addr:  20010160  hwm:  16384  length:  32704  bytesAvailible:  49536  size requested:  16384
Error pushing.  

Кто-нибудь может помочь?
Почему поток запрашивает данные, вызывая _read (size), даже если внутренний буфер заполнен? Почему внутренний буфер не очищается?

Спасибо!

Ответ №1:

Кажется, я не понял возвращаемое значение this.push. Мне нужно передавать данные до тех пор, пока они не вернут false. Я попытался снова загрузить фрагмент, когда получил false, потому что подумал, что это нецелесообразно.