Nodejs 转换中的 push() 和回调有什么区别



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

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)

是的。我当前的代码运行良好。

但是我发现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.
},
});

我觉得有些尴尬。我搜索了一些关于创建Transform流的博客。我找到的所有文章都告诉我必须用this.push()而叫callback()。但是他们都没有提到callback()的第二个参数。

那么,我的问题是:

  • 当传递转换值时,this.push()callback()之间是否存在差异?
  • 为什么很多人推荐使用this.push而不是callback?

from nodejs document

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

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

callback函数必须只在当前chunk被完全占用时调用消耗。传递给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);
};

最新更新