nodejsstream可读性卡在第一个可读对象

我有一个NodeJSstream.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事件。

请注意,当没有更多数据要读取时,事件end

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

解决scheme是继续阅读,直到stream的结束。

 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.'); });