我是Node.JS的新手,并试图了解through2库。
我想知道回调(在下面的代码中从上面的链接复制的代码)是如何有用的。如果可能的话,请用一小段代码解释。
fs.createReadStream('ex.txt')
.pipe(through2(function (chunk, enc, callback) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 97)
chunk[i] = 122 // swap 'a' for 'z'
this.push(chunk)
callback()
}))
.pipe(fs.createWriteStream('out.txt'))
答案 0 :(得分:5)
答案 1 :(得分:2)
如果您从您提供的链接中阅读了通过2文档,您已经看到了这一点:
API
through2([options,] [transformFunction] [,flushFunction])
请参阅stream.Transform文档,了解相关规则 transformFunction(即this._transform)和可选的flushFunction (即this._flush)。
然后,如果您点击stream.Transform
链接并阅读其中的文档,您迟早会得到此信息:https://nodejs.org/docs/latest/api/stream.html#stream_transform_transform_chunk_encoding_callback
它说:
transform._transform(chunk,encoding,callback)#
chunk
缓冲区| String要转换的块。将永远是一个 缓冲区,除非decodeStrings选项设置为false。encoding
String如果块是一个字符串,那么这就是编码 类型。 (如果decodeStrings块是缓冲区,则忽略。)callback
功能调用此函数(可选择出错) 完成处理提供的块后,参数和数据。
所以基本上它是一个函数,你应该调用它来向流发信号通知你已完成处理。您不能简单地从函数返回以表示您已完成处理的原因是因为您可能有一些异步任务(查询数据库,通过网络发送数据包等),这将导致函数返回在任务完成之前。
我个人认为callback
对此不好。一个更好的名字就像Mocha的done()
或承诺resolve()
。幸运的是,参数的名称不是由node.js或through2库决定的,而是由你决定的。所以,如果我是你,我会这样写:
fs.createReadStream('ex.txt')
.pipe(through2(function (chunk, enc, done) {
for (var i = 0; i < chunk.length; i++)
if (chunk[i] == 97)
chunk[i] = 122; // swap 'a' for 'z'
this.push(chunk);
done();
}))
.pipe(fs.createWriteStream('out.txt'))