#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, потому что подумал, что это нецелесообразно.