找出流块是否是最后一个

时间:2017-09-29 18:13:44

标签: javascript node.js typescript

在转换函数中编写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的块何时结束,对由所有块组成的缓冲区进行一些处理,然后从流中推送处理过的数据。

3 个答案:

答案 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}}