当前位置: 首页 > 知识库问答 >
问题:

找出流块是否是最后一个

那安宁
2023-03-14

在Transform函数中编写NodeJS Transform stream时,我如何知道该块是最后一块还是没有任何新块出现。

js prettyprint-override">_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个答案

赵河
2023-03-14

使用through2

fs.createReadStream('/tmp/important.dat')
  .pipe(through2(
    (chunk, enc, cb) => cb(null, chunk), // transform is a noop
    function (cb) { // FLUSH FUNCTION
      this.push('tacking on an extra buffer to the end');
      cb();
    }
  ))
  .pipe(fs.createWriteStream('/tmp/wut.txt'));   
高迪
2023-03-14

例如,

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;
};
贲永思
2023-03-14

\u转换中无法确定是否会有更多数据。

根据您的用例,您可以收听end事件,或者使用\u flush

流:转换_刷新(回调):

自定义Transform实现可以实现转换。_flush()方法。当没有更多的写入数据要消耗时,但在发出通知可读流结束的'end'事件之前,将调用此选项。

在_flush()实现中,readable.push()方法可以被调用0次或更多次。刷新操作完成时必须调用回调函数

 类似资料:
  • 问题内容: 我有一个关于学校作业的问题,我需要用Java来完成。我需要从文件加载数据并检查这些文件中的错误。 我读取带有的文件,该文件在文件末尾之前都可以正常运行:如果该行为空,它将忽略最后一行。 我知道如何检查空行,但是使用的功能,最后一行根本不会给出任何结果。 重要的是,我知道最后一行是否必须为空。如果空行不存在,则应该给出错误。 长话短说,我需要一种方法来说明以下情况(行尾在哪里)之间的区别

  • 问题内容: 是否有任何条件最终可能无法在Java中运行?谢谢。 问题答案: 注意:如果在执行try或catch代码时JVM退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或杀死,即使整个应用程序继续运行,finally块也可能不会执行。 我不知道finally块无法执行任何其他方式…

  • 问题内容: 有没有一种方法可以检查我是否在最后一条记录上?谢谢 问题答案: 使用此模式来标识和处理结果的最后一行:

  • 问题内容: 考虑以下测试案例: 输出: 对于为什么在相反的情况下最终发生捕获的原因有何解释? 问题答案: 由于中的区块没有区块,因此只有。该代码不会像您认为的那样“跳回”调用者,然后再“跳回”到调用者。

  • 问题内容: 我不认为“为什么?” 这个问题很重要…但是我需要做的是 DIV的最后一行文本。通常,div的最后一行(如果没有其他行,则是第一行,这是当前情况)没有理由,而是左对齐。我知道这可能根本没有意义,但是我绝对需要最后一行是合理的! __ 问题答案: 这是一种跨浏览器方法,可在IE6 +中使用 它结合了text-align-last:理由;这是由IE和:after伪内容方法的一种变体支持的。它