在转换函数中编写NodeJS转换流时,我怎么知道块是最后一个还是没有任何新的块。
_transform(chunk: any, encoding: string, callback: Function): void {
// accumulating chunks here to buffer
// so that I need to do some processing on the whole buffer
// and I need to understand when to do that
}
所以我需要知道进入Stream的块何时结束,对由所有块组成的缓冲区进行一些处理,然后从流中推送处理过的数据。
答案 0 :(得分:3)
在_transform
中,您无法确定是否会有更多数据。
根据您的使用情况,您可以收听end
事件,也可以使用_flush
:
Stream: transform._flush(callback):
自定义转换实现可以实现
transform._flush()
方法。当没有更多要写入的数据时,但在发出'end'
事件之前,将发出此信号,表示可读流的结束。在
transform._flush()
实现中,readable.push()
方法可以根据需要调用零次或多次。刷新操作完成后,必须调用回调函数。
答案 1 :(得分:0)
实施例,
const COUNTER_NULL_SYMBOL = Symbol('COUNTER_NULL_SYMBOL');
const Counter = () => {
let data = COUNTER_NULL_SYMBOL;
let counter = 1;
let first = true;
const counterStream = new Transform({
objectMode: true,
decodeStrings: false,
highWaterMark: 1,
transform(chunk, encoding, callback) {
if (data === COUNTER_NULL_SYMBOL) {
data = chunk;
return callback();
} else {
this.push({data, counter, last: false, first});
first = false;
counter++;
data = chunk;
return callback();
}
},
});
counterStream._flush = function (callback) {
if (data === COUNTER_NULL_SYMBOL) {
return callback();
} else {
this.push({data, counter, last: true, first});
return callback();
}
};
return counterStream;
};
答案 2 :(得分:0)
使用through2
{{1}}