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
事件。
答案 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.');
});