节点js转换中的push()和回调有什么区别

what's differnce between push() and callback in nodejs Transform

我正在实现一个 Transform stream,它由 mongoose 游标传输(它像可读流一样工作,(或者它可能是真正的可读流))

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)

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

但我发现 callbacktransform 实现中,接收第二个参数(这看起来很像经典的 nodejs 异步回调样式)。

所以,我像下面这样更改了我的代码,发现它也可以正常工作..

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

我觉得有些尴尬。我搜索了一些关于创建转换流的博客。我发现的所有文章都告诉我必须使用 this.push() 并调用 callback()。 但是 none 他们甚至提到了 callback().

的第二个参数

那么,我的问题是:

来自 nodejs 文档

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

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

callback函数必须在当前块完全完成时调用 消费。传递给 callback 的第一个参数必须是 Error 对象 如果在处理输入时发生错误,否则 null。如果一秒钟 参数传递给 callback,它将被转发到 transform.push() 方法。

换句话说,以下是等价的:

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

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