1
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 并完成。

为什么会这样?那么,如果阅读器的源也触发了可读事件,我该如何处理可读事件呢?

谢谢回答。

4

0 回答 0