我正在尝试实现一个可读流。数据源是在启动时产生大量数据的度量工具。我试图在我的_read(size)实现中一次推送大量数据。当我开始测量并延迟流时,我已经有了比内部缓冲区更多的数据,我得到了奇怪的行为。
- 我尝试推送请求大小的数据->错误,需要减少一点(在我的情况下32)
- 即使第一次推送成功,接口再次调用_read(size),当我尝试推送请求的大小时,我得到了一个错误。内部缓冲区仍然满。
- 当我在数据比内部缓冲区大之前启动流时,一切正常。
_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)请求数据,即使内部缓冲区已满?为什么内部缓冲区没有被清空?
谢谢!
似乎我没有理解this.push的返回值。我需要推入数据,直到它返回false。当我得到false的时候,我试着再次推这个块,因为我认为它不成功。