我试图通过编写一个小脚本来学习Nodejs中的流媒体。但是在执行完这个之后,最后一个流并没有推送所有数据。
var stream = require('stream');
var fs = require('fs');
var util = require('util');
function Newliner () {
stream.Transform.call(this);
}
util.inherits(Newliner, stream.Transform);
Newliner.prototype._transform = function(chunk, enc, done) {
var split = 0;
for( var i =0; i <chunk.length; i++){
if(chunk[i] == 10) {
this.push(chunk.slice(split,i));
split = i+1;
}
}
}
function Greper(options) {
stream.Transform.call(this);
this.regex = new RegExp(options);
}
util.inherits(Greper, stream.Transform);
Greper.prototype._transform = function(chunk, enc, done) {
this.push(chunk); //Even this is not working.
/*
var a = chunk.toString();
if(this.regex.test(a)){
this.push(chunk);
}
*/
}
var n = new Newliner();
var g = new Greper("line");
var f = fs.createReadStream('a.txt');
f.pipe(n).pipe(g).pipe(process.stdout);
输入文件a.txt是,
This is line one.
Another line.
Third line.
仅显示一行。这是什么原因?
$ node test.js
This is line one.
注意:当我将文件读取流直接传送到'g'时,它可以正常工作。
答案 0 :(得分:0)
完成处理块后,需要调用_transform()
函数的回调。来自the documentation:
callback
(函数)完成处理提供的块后,调用此函数(可选择使用错误参数)。
在调用回调之前,不会再将数据推送到流中。如果你没有调用它,那么块将不会被视为已处理...这就是为什么你的程序在只处理一行后就停止了。
只需添加:
done();
在Newliner.prototype._transform
和Greper.prototype._transform
函数的末尾。