Node.JS通过2callback

我是Node.JS的新手,并试图了解through2库。

我想知道如何callback(在下面的示例代码是从上面的链接复制)是有用的。 请尽可能使用一小段代码来解释。

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')) 

我相信需要继续pipe道链。 如果你不打电话,pipe子就会破裂。

这个声明来自通过2文件 :

一个最小的实现应该调用callback函数来表明转换完成了,即使这个转换意味着丢弃了这个块。

如果您从您提供的链接中阅读了via2文档,您会看到:

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。
  • encodingstring如果块是一个string,那么这是编码types。 (如果decodeStrings块是缓冲区,则忽略。)
  • callback函数当您完成处理所提供的块时,请调用此函数(可选地使用错误参数和数据)。

所以基本上,这是一个函数,你应该打电话给你的信号stream处理。 你不能简单地从函数返回,以表示你正在处理的信号是因为你可能有一些asynchronous的任务(参考数据库,通过networking发送一个数据包等),这将导致函数返回任务完成之前。

我个人认为callback是一个坏名字。 一个更好的名字就像Mocha的done()或promise 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'))