Javascript 节点js.10 fs.createReadStream streams2未触发结束事件
我正在使用Node.js v0.10.26,并尝试使用新的stream2 API, 尤其是可读api 但是“结束”事件从来没有被调用过,我也不知道为什么。我想这就是为什么我的下游转换流组件没有调用它们的_flush、finish、close事件Javascript 节点js.10 fs.createReadStream streams2未触发结束事件,javascript,node.js,stream,fs,Javascript,Node.js,Stream,Fs,我正在使用Node.js v0.10.26,并尝试使用新的stream2 API, 尤其是可读api 但是“结束”事件从来没有被调用过,我也不知道为什么。我想这就是为什么我的下游转换流组件没有调用它们的_flush、finish、close事件 var rqt = fs.createReadStream('some.csv.gz'); //readable rqt.on('readable', function () { console.log('readable!'); }) .
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*/ })
产出:
更新 这样做的真正目的是实现如下流:
rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
console.log("Finished Parsing " + csvp.records + ' ' + line);
});
它根本不使用经典模式,
在功能上,它加载gzip压缩的csv,解析csv并显示找到的csv数量。加载、解压缩和解析都可以正常工作
但是,不会调用以下各项:
-csvp的_flush从未被调用
-on('finish'事件您将流动模式和非流动模式API稍微混合了一下。从文档中: 请注意,除非数据被完全消耗,否则不会触发end事件。这可以通过切换到flowing模式来完成,也可以通过反复调用read()来完成,直到结束
对上面代码段最简单的修复方法就是删除“可读”绑定,然后您应该处于常规流模式,“数据”事件将激发,直到流为空,然后“结束”将激发。或者我发现添加了一个像这样读取的调用rqt.on('readable',function(){console.log('readable!';rqt.read();})我知道这一点,但尽管如此,他的代码在v0.10.26上对我有效,我得到了他期望的输出。嗯,实际上我尝试了你的建议,删除了.on(“可读的”它对我不起作用是的,我还没有测试它的确切细节,但我很确定基本的问题是缓冲数据期望你调用
read
。如果你得到了事件绑定、流动/非流动模式和方法调用的正确组合,所有这些都应该很好,但你不能只绑定所有的事件并调用所有的方法lly-nilly.Listening for'readable'首先启用streams2模式,但随后以下'data'事件处理程序将其切换为streams1模式。之后,它不会尝试使用原始代码切换回streams2。我遇到了完全相同的问题,您是否以某种方式解决了它?接受的答案似乎无助于Streams就像消防软管g通过管道,如果您处于流动模式,如果您有足够的输入,则必须将其排空..否则它将被备份并且永远无法完成。这是为了防止内存泄漏。
rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
console.log("Finished Parsing " + csvp.records + ' ' + line);
});