我使用Node.js v0.10.26,并尝试使用新的stream2 apis http://blog.nodejs.org/2012/12/20/streams2/, 特别是Readable api,http://nodejs.org/api/stream.html#stream_class_stream_readable
但是'结束'事件永远不会被调用,我无法弄清楚原因。我认为为什么我的下游变换流组件不会调用他们的_flush,完成,关闭事件,
var rqt = fs.createReadStream('some.csv.gz');
//readable
rqt.on('readable', function () { console.log('readable!'); })
.on('data', function (data) { console.log('Data!', data); })
.on('error', function (err) { console.error('Error', err);/* READ if there was an error receiving data. */ })
.on('end', function () { console.log('All done!'); /* READ fires when no more data will be provided. */ })
.on('finish', function () { console.log('All Finished!'); /*WRITEABLE */ })
.on('close', function () { console.log('close!'); /*WRITEABLE not all streams emit this*/ })
readable
readable
Data
readable
readable
Data
readable
UPDATE 这样做的真正目的是做一个像这样的流:
rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
console.log("Finished Parsing " + csvp.records + ' ' + line);
});
根本没有经典模式, 在功能上加载一个gzip压缩包,解析csv并显示找到了多少。加载,解压缩和解析都可以正常工作。
但是以下都没有被调用: - csvp的_flush永远不会被调用 - 开启('完成'事件
答案 0 :(得分:2)
您正在混合流动模式和非流动模式API。来自文档:
请注意,除非数据被完全消耗,否则不会触发结束事件。这可以通过切换到流动模式,或重复调用read()直到你结束来完成。
上面最简单的修补程序只是为了删除“可读”绑定,然后你应该处于常规流动模式,“数据”事件将会触发,直到流为空,然后“结束”才会触发。