nodejs流可读卡在第一个可读对象上

时间:2014-11-05 08:25:27

标签: javascript ruby-on-rails node.js

我有NodeJS stream.Readable

var async = require('async'),
    util = require('util'),
    ReadableStream = require('readable-stream').Readable;

function ArticleReader() {
  ReadableStream.call(this, { objectMode: true });
}

util.inherits(ArticleReader, ReadableStream);

ArticleReader.prototype._read = function() {
    var articles = ['article1', 'article2'];
    var self = this;
    async.each(articles, function(link, callback) {
       self.push(article);
       callback();
    }, function(err) {
        if (err) {
            self.emit('error', err);
        } else {
            self.push(null);
        }
    });
};

这就是消费者:

var article = new ArticleReader();

  article.on('readable', function() {
  var buf = article.read();
  console.log(buf);
});

article.on('end', function() {
  console.log('end');
});

这是输出:

'article1'

问题是程序停留在'article1',它永远不会读取'article2',也永远不会达到end事件。

1 个答案:

答案 0 :(得分:3)

请注意,当无法读取更多数据时,会触发事件end

除非数据完全耗尽,否则end事件不会触发。这可以通过切换到flowing mode或重复调用read()直到您完成为止来完成。

解决方案是继续阅读,直到达到流的末尾。

var readable = getReadableStreamSomehow();

readable.on('readable', function() {
  while ((buf = readable.read()) != null) {
    console.log(buf);
  }
}

readable.on('data', function(chunk) {
  console.log('got %d bytes of data', chunk.length);
})
readable.on('end', function() {
  console.log('there will be no more data.');
});