Node.JS to2回调

时间:2015-05-11 04:31:54

标签: javascript node.js callback

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

2 个答案:

答案 0 :(得分:5)

我认为需要继续进行管道连接。如果你不打电话,管子就会破裂。

此声明来自through2 documentation

  

最小的实现应该调用回调函数来指示   转换完成后,即使转换意味着   丢弃大块。

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