TypeScript中"pipe"管道的概念

471 阅读3分钟

"Pipe" 函数通常是一个高阶函数,它接受一系列函数作为参数,并返回一个新的函数,这个新函数会依次调用传入的函数,将前一个函数的输出作为下一个函数的输入

高阶函数,指把函数作为参数的函数

在流中的使用

在 Node.js 中,pipe 是一个非常重要的概念和方法,用于处理流(Stream)之间的数据传输。流是一种用于处理大量数据的机制,可以逐块地处理数据,而不必一次性将所有数据加载到内存中。pipe 方法允许你将一个可读流的数据传输到一个可写流,从而构建一个数据流的处理管道

应用:将一个文件中内容复刻到另一个文件中

const fs = require('fs');

const readableStream = fs.createReadStream('input.txt'); // 创建可读流
const writableStream = fs.createWriteStream('output.txt'); // 创建可写流

readableStream.pipe(writableStream); // 将可读流的数据传输到可写流

compressing库中,使用流的方式实现下载功能

附compressing(一个操作压缩文件的库)链接

@Get('stream')
  async download_stream(@Res() res: Response) {
    // 从upload中往上层走,所有使用..
    const url = join(__dirname, '../images/demo.png')
    // new一个zip格式的文件流
    const tarStream = new zip.Stream()
    // 添加要压缩的条目,可以是文件路径、目录路径、缓冲区或流。
    await tarStream.addEntry(url)
    // 设置请求头
    res.setHeader('Content-Type','application/octet-stream')
    res.setHeader('Content-Disposition',`attachment;filename=demo`)
    // 将流对象通过pipe传递给res
    tarStream.pipe(res)
  }

Rxjs中pipe的使用

pipe 函数是 RxJS 中用于连接多个操作符的工具,它在操作 Observable 数据流时非常有用。然而,虽然你可以使用 pipe 函数来组合多个操作符,但并不是随意使用的。
pipe 函数应该在操作 Observable 时使用,它的作用是将多个操作符按顺序连接起来,形成一个操作链。这使得你可以在 Observable 上进行一系列的操作,例如映射、过滤、合并等

import { interval } from 'rxjs';
import { take, map, filter } from 'rxjs/operators';

// 创建一个每1000ms发出一个递增数字的Observable
const source = interval(1000);

// 使用pipe操作符连接多个操作符
const result = source.pipe(
// 取0,1,2,3,4
  take(5),          // 只取前5个值
// 取0,2,4,6,8
  map(value => value * 2), // 将值乘以2
// 取0,6
  filter(value => value % 3 === 0) // 过滤出能被3整除的值
);

result.subscribe(
  // 这是 subscribe 方法的第一个参数,也是必需的。它是一个函数,用于处理 Observable 发出的每个数据项。每当 Observable 发出一个数据项时,这个函数就会被调用,将数据项作为参数传递给它
  value => console.log(value),
  // 这是 subscribe 方法的第二个参数,是一个可选参数。它是一个函数,用于处理 Observable 发出的错误通知。如果 Observable 在处理过程中遇到错误,这个函数就会被调用,将错误作为参数传递给它。
  err => console.error(err),
  // 这是 subscribe 方法的第三个参数,也是可选的。它是一个函数,用于处理 Observable 发出的完成通知。当 Observable 完成发出所有数据项时,这个函数就会被调用
  () => console.log('Complete')
);

image.png