var util = require('util');
var ReadableStream = require('stream').Readable;
function MyReadStream() {
ReadableStream.call(this);
this._index = 0;
this._string = 'Hello World!';
}
util.inherits(MyReadStream, ReadableStream);
MyReadStream.prototype._read = function() {
var i = this._index++;
if (i == this._string.length) {
this.push(null);
this.pipe(process.stdout);
}
else {
var buf = new Buffer(this._string[i], 'utf8');
this.push(buf);
}
};
var readerInst = new MyReadStream();
readerInst.read();
==============================================
为什么我得到stdout 'ello World!,而不是"Hello World!"?
发生的事情是readerInst.read()
(它要求任意数量的字节)导致_read()
被执行,因为还没有数据可读,所以_read()
将第一个字符推入流,然后由readerInst.read()
返回。在调用结束后,字符串的其余部分被推入流,当到达字符串的末尾时,内容通过管道传输/写入stdout,它只会显示从第二个字母开始的字符串。
您可以通过记录readerInst.read()
的返回值来验证这是否发生。