Nodejs Transform中的push()和callback有什么区别

Bad*_*bby 1 javascript stream node.js nodejs-stream

我正在实现一个由猫鼬光标进行管道传输的转换流(其工作方式类似于可读流,(或者可能是真正的可读流))

const myTransform = new Transform({
  readableObjectMode: true,
  writableObjectMode: true,
  transform(chunk: Document, encoding, callback) {
    this.push(chunk?.toObject() ?? null); // <- transforms data
    callback(); // <- calls callback
  },
});

MyMongooseModelWithHugeData.find()
  .cursor()
  .pipe(myTransform)
  .pipe(someWriteStream)
Run Code Online (Sandbox Code Playgroud)

是的。我当前的代码工作正常。

但我发现callback内部transform实现,接收第二个参数(显然看起来像经典的nodejs异步回调风格)。

所以,我改变了我的代码,如下所示,发现它也工作得很好。

const myTransform = new Transform({
  readableObjectMode: true,
  writableObjectMode: true,
  transform(chunk: Document, encoding, callback) {
    callback(null, chunk?.toObject() ?? null); // <- transforms data and calls callback.
  },
});
Run Code Online (Sandbox Code Playgroud)

我感到有些尴尬。我搜索了一些有关创建转换流的博客。我发现的所有文章都告诉我必须使用this.push()和调用callback()。但他们甚至没有提到 的第二个参数callback()

所以,我的问题是:

  • this.push()传递转换值时和传递转换值时有区别吗callback()
  • 为什么很多人建议使用this.push而不是callback

Nao*_*dgi 7

来自nodejs文档

https://github.com/nodejs/node/blob/master/doc/api/stream.md#transform_transformchunk-encoding-callback

任何给定的输入数据块都可能不会生成任何输出。

callback仅当当前块完全消耗时才必须调用该函数。如果在处理输入或其他情况时发生错误,则传递给 的第一个参数callback必须是一个对象。如果将第二个参数传递给,它将被转发到该 方法。Errornullcallbacktransform.push()

换句话说,以下内容是等效的:

transform.prototype._transform = function(data, encoding, callback) {
  this.push(data);
  callback();
};

transform.prototype._transform = function(data, encoding, callback) {
  callback(null, data);
};
Run Code Online (Sandbox Code Playgroud)