伍.3.1 什么是响应式编程?
响应式编程简称RP(Reactive Programming),是一种面向异步(asynchronous)数据流(Data Stream)的编程范式。其实,这并不是什么新东西,而是新瓶装旧酒,把编程中常用的发布-订阅模式发扬光大,然后形成一整套可供我们高效解决问题的编程范式。
接上面说的,其实数据流也不是新东西。举个例子,我们在浏览器中单击一个按钮,这个点击事件(event)就是一个真正的异步数据流(asynchronous data stream),以下简称流。在这个流里面,你可以观察一些对象,也可以做一些响应处理,总之随你喜好。
而且,我们可以把任意东西包装成流,而不限于点击事件、或者鼠标滑过事件。流无处不在,信手拈来,任意东西都可以成为流:变量、用户的操作、属性、缓存、数据结构等等。譬如:假想你的微博首页是一个流,那么你就可以监听它的变化,并且根据需要采取阅读与否的决定(做出响应)。
最重要的是,我们将获得令人惊叹的功能工具箱,这个工具箱里面有一系列函数,可以帮助我们组合、创建、过滤这些流。是的,这时候函数式编程就派上用场了。如果不了解函数式编程,可以看本书之前的相关章节。
流可以用作另一流的输入, 甚至多个流也可以用作另一个流的输入。 您可以合并两个流。 您可以过滤流以获得另一个只包含您感兴趣的事件的流。您可以将数据值从一个流映射到另一个新流。
既然流对于响应式(Reactive)如此重要,那么,让我们从熟悉的“单击按钮”这个事件流开始细致地研究它们。接下来我们看一个图,因为看起来像一颗颗弹珠,通常这类型的图叫弹珠图。

弹珠图
如上图,水平从左至右的箭头线表示时间线。流是按时间顺序排列的一系列进行中的事件, 它可以含有三种不同的东西:
- 一个值(是某种类型的)。也就是上图的各色弹珠。
- 一个错误(也可能没有)。也就是上图的红叉。
- 一个“完成”信号(也可能没有)。也就是上图中时间线上的竖线。 例如,当包含该按钮的当前窗口或视图关闭时,可以认为流发出了“完成”信号。
接下来,让我们做点有趣的事情:创建从原始点击事件流转换而来的新点击事件流。