2016-10-24 1 views
0

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

  • Я стараюсь передавать данные из требуемого размера -> ошибки, необходимо уменьшить его немного (в моем случае 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), даже если внутренний буфер заполнен? Почему внутренний буфер не очищается?

Спасибо!

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^