我读到如果内部缓冲区已满,ReadStream #push方法返回false,我做了一个实验。
"use strict";
var Readable = require("stream").Readable;
var i = 0;
class CountableStream extends Readable {
constructor(options) {
super(options);
}
_read() {
if (i < 10) {
i++;
for (var k = 1; k <= 3; k++) {
// highWaterMark is set to 3, while we push 3 objects here,
var ret = this.push({test: i * k});
console.log(ret); //print "false" here, which means the internal buffer is full
}
} else {
this.push(null);
}
}
}
// Set highWaterMark to 1 purposefully
var s = new CountableStream({objectMode: true, highWaterMark: 1});
s.on("data", function (data) {
//I can print all data without losing any
console.log("!!" + JSON.stringify(data));
});
正如您可能从代码中读到的那样,我正在推动更多的元素,而不是内部缓冲区可以容纳,但我仍然可以打印所有元素而不会遗漏任何元素。 显然,过多的数据被真正地推到缓冲区而不会丢弃它们。
然后我怀疑是
“highWaterMask”只是提示控制速度而非严格限制吗?
如果push方法返回false,我想我可以调用“this.pause()”来暂时停止流,但是我该如何重新恢复此流?我应该在任何事件回调中调用resume方法吗?
谢谢!