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