【发布时间】:2017-03-06 10:17:40
【问题描述】:
我正在尝试实现一个可读流。数据源是一种测量工具,启动时会产生大量数据。 我试图在我的 _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) 来请求数据?为什么内部缓冲区没有被清空?
谢谢!
【问题讨论】: