我正在实现一个转换流,这是由猫鼬游标管道(其工作方式类似于可读流,(或者它可能是真正的可读流))
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);
};