EnriqueMark
Angular

Observable的pipe

2026-04 简体中文

这就像一个中间截流管,可以说是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 速查 ,完全背下来没什么意义,需要时再查找即可。