当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js stream.compose(...streams)用法及代码示例


stream.compose(...streams)

添加于:v16.9.0
Stability: 1 - stream.compose 是实验性的。

参数

将两个或多个流组合成 Duplex 流,该流写入第一个流并从最后一个流读取。使用 stream.pipeline 将每个提供的流通过管道传送到下一个。如果任何流错误,则所有流都将被销毁,包括外部Duplex 流。

因为stream.compose 返回一个新流,该流又可以(并且应该)通过管道传输到其他流中,因此它启用了组合。相反,当将流传递给 stream.pipeline 时,通常第一个流是可读流,最后一个流是可写流,形成一个闭路。

如果通过 Function 它必须是采用 source Iterable 的工厂方法。

import { compose, Transform } from 'node:stream';

const removeSpaces = new Transform({
  transform(chunk, encoding, callback) {
    callback(null, String(chunk).replace(' ', ''));
  }
});

async function* toUpper(source) {
  for await (const chunk of source) {
    yield String(chunk).toUpperCase();
  }
}

let res = '';
for await (const buf of compose(removeSpaces, toUpper).end('hello world')) {
  res += buf;
}

console.log(res); // prints 'HELLOWORLD'

stream.compose 可用于将异步迭代、生成器和函数转换为流。

  • AsyncIterable 转换为可读的 Duplex 。无法产生 null
  • AsyncGeneratorFunction 转换为可读/可写转换 Duplex 。必须将源AsyncIterable 作为第一个参数。无法产生 null
  • AsyncFunction 转换为可写的 Duplex 。必须返回 nullundefined
import { compose } from 'node:stream';
import { finished } from 'node:stream/promises';

// Convert AsyncIterable into readable Duplex.
const s1 = compose(async function*() {
  yield 'Hello';
  yield 'World';
}());

// Convert AsyncGenerator into transform Duplex.
const s2 = compose(async function*(source) {
  for await (const chunk of source) {
    yield String(chunk).toUpperCase();
  }
});

let res = '';

// Convert AsyncFunction into writable Duplex.
const s3 = compose(async function(source) {
  for await (const chunk of source) {
    res += chunk;
  }
});

await finished(compose(s1, s2, s3));

console.log(res); // prints 'HELLOWORLD'

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 stream.compose(...streams)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。