var stream = require('stream');
var util = require('util');
function SourceReader(source){
stream.Readable.call(this);
this._buffer = '';
this._source = source;
source.on('readable', function(){
console.log('got here');
this.read();
}.bind(this));
}
util.inherits(SourceReader, stream.Readable);
SourceReader.prototype._read = function(){
var chunk = this._source.read();
console.log('chunk:'+ chunk);
if(chunk !== null){
this.push(chunk);
}
else
this.push(null);
};
var fs = require('fs');
var fileStream = fs.createReadStream('my.txt'); //some data
var sourceReader = new SourceReader(fileStream);
上面的代码按预期工作并输出
got here
chunk:some data
chunk:null
但是当我向事件“可读”添加一个监听器时,没有数据被读取。
sourceReader.on('readable', function(){
// it doesn't even get here
var data = sourceReader.read();
console.log(data);
});
输出:
chunk:null
got here
似乎 SourceReader._read 在源的可读事件被触发之前被调用并且可能什么也没读。但是随后源可读事件触发并调用 SourceReader.read() 但这一次不会进入 SourceReader._read 并完成。
为什么会这样?那么,如果阅读器的源也触发了可读事件,我该如何处理可读事件呢?
谢谢回答。