---
title: "Observable的pipe"
date: "2026-04"
category: "Angular"
tags: ["Angular"]
description: "这就像一个中间截流管，可以说是Observable的中间件。里面预定义了一些RxJS的处理方法，可以让我们对返回的结果进行截留，然后按我的要求进行一个预处理..."
source: "https://enriquemark.com/zh-hans/posts/Observable%E7%9A%84pipe"
---

这就像一个中间截流管，可以说是`Observable`的中间件。里面预定义了一些RxJS的处理方法，可以让我们对返回的结果进行截留，然后按我的要求进行一个预处理。而这里就和字面意思一样，信息流可以理解为水，pipe就是插在中间的过滤器，走一遭出来，得到处置过的水，整个流都要经过他。

信息流在这里的处置被抽象化为了一节一节：A流进入，处置，离开；B流进入，处置，离开。官方用弹珠图 (Marble Diagrams)表达的正是这个概念。整个处置过程看起来很像是阵列，单独对每个元素（流切片）进行处置，处置完了放行。所以`map`这个概念就很好理解了：`map(i => i + 1)`，这里的`map`绝对不是在处理一个阵列，而正是在处理流切片，`i`指的也是其中一个切片，而不是阵列元素。理解了这点，就会知道很多看上去好像是在操作`list`的方法（比如还有`filter`）其实早就不是原版那个了，pipe真正的操作对象一直是`Observable`，也只有它可以作为流被处理。

阵列处理的是空间上的多个元素，而管道中处理的是时间上的连续多个元素——抽象的意义上两者没什么差别。而pipe的定义时机是在数据到来之前，`subscribe`代表通水的话，在此之前，过滤器就要先就位。

而从水和管道的角度来理解的话，Cold Observable 和 Hot Observable 这个概念就会好懂很多。前者代表是单次给水，谁`subscribe`我就给谁通一次水，每次都要从触发源头的抽水操作，结束后就关闭。但后者就不一样了，它代表的是一个启动一次就时刻运作的持续给水，任何人都可以从其中取水，而不再需要每次都通知源头重复进行抽水操作。放在IO上，这就是一次IO和重复IO的区别。如果有一千个人要取一个数据，前者会重复打一千次后端，但后者只需要一次，剩下的按需取得。后者其实就是标准的发布-订阅逻辑，既然数据是单一的，而不是每次都要拿不同的，那么只需要发布一次，后来者直接订阅即可拿到结果，而不需要每次都去发请求。

除了`map`之外，pipe还有一百多个`Operator`，比较常用的可以见 RxJS 速查 ，完全背下来没什么意义，需要时再查找即可。
