【ReactiveX】介绍(译)

title
ReactiveX 是通过使用 Observable 序列用来合成异步的和事件响应式的程序上的库文件。
它扩展了通知者模式来支持数据和/或事件的响应队列,并且增加让你能够显示的合并序列的操作,这些操作和一些抽象概念有关,例如:低级别线程、同步、线程安全、并发数据结构,非阻塞I/O。
Observables 采用了理想的方式控制多要素的异步队列,这种方式也解决了上述问题。
1234
它经常被叫做“函数响应式编程”,但是其实是一个误解。ReactiveX 也许是面向函数的,同样也许是面向响应式的,但是“函数响应式编程”是一个不同的东西。一个主要的区别点是,“函数响应式编程”是一个基于连续变化数据的操作,但是ReactiveX是基于离散的发射的数据的操作。

为何使用 Observables

ReactiveX Observable model 让你能够像对待
ReactiveX Observable model 让你能够像对待类似数组的集合数据的简单的和复合的操作的顺序,来对待异步事件流。它能够让你从杂乱网状的回调函数中脱身,从而能够让你的代码可读性更高,并且有更少的易发Bug。

Observables 是可组合的

像类似于 Java Future 的技术在运用到一个单一级别的异步执行的时候是简单直观的,但是当有嵌套关系的时候,他们就会增加上很多复杂性。
使用 Futures 来最佳组合有条件的异步执行流程是很困难的(或者自从各个请求在 runtime 的潜伏期变化时候,就变得不可能了)。当然,这些都能够被解决,但是他会快速的变得复杂(和错误频发),或者它会过早地阻塞在 Future.get(),也消除了异步执行的优势。
另一方面,ReactiveX Observables 被设计用来处理异步数据的组合流程和队列。

Observable 是自适应的

ReractiveX Obserables 不仅能支持单一维度的数据(类似于 Funtures do),也支持数据队列甚至是无限的数据流。Observable 是一个单一抽象体,它能够被用在任何用例上。Observable 有所有的灵活性和优雅的适应其镜像迭代器。
Observable 是一个异步/推送的dual 同步/拉取的iterable。
2345

Observables 不是固步自封的

ReactiveX并是不是基于某些特殊的并发、同步源。Observables 能够使用线程池、事件循环、非阻塞IO、actor,或者任何实现方式,只要它能够满足你的需求、你的风格、或者你的专业知识。前端代码将 Observables 能实现的交互都看做异步的,无论你的潜在实现是阻塞、非阻塞,你决定如何实现它。

Observables 如何实现?

public Observable<data> getData();
它是否和调用者一样在同一个线程中同步执行?
它是否在不同的线程上异步执行?
由于它将工作通过多线程进行拆分,是否会返回在任意顺序将数据返回给调用者?
他是否使用 Actor 而不是线程池?
他是否使用 NIO 和一个事件循环来处理异步网络请求?
他是否使用一个事件循环来将工作线程从回调线程中区分开来?
在 Observer 的角度看来,这些都无关紧要。
注意:通过 ReactiveX,你能更晚的改变你的想法,从根本上改变你的 Observables 的潜在自然实现,而不是将你的消费者从你的 Observable 上拆开。

Callbacks 有他们自身的问题

Callbacks 解决了为了不让任何事阻塞,提前阻塞了 Future.get() 的弊端。当回调开始,他们能够自然地执行。
但是对于 Futures 来说,当然,callbacks 在单一级别的异步执行上是可以方便使用的,但是在复杂嵌套式的组合上他们就变得不那么易用。

ReactiveX 是一个多元的实现方式

ReactiveX 现在实现了多种语言的支持,而且是基于各种语言自己的范式,同时,更多语言正在被加入进来。

Reactive 编程

ReactiveX 支持多种操作,你能够筛选、选择、转换、合并和组合 Observables。允许有效的执行和编写。
你能够将 Observables 类看做是一个类似于 iterable 的推送过程,但是是拉取。使用 iterable,消费者从生产者处拉取数据,这时线程中断了,直到这是数据正常返回。与此相反,通过 Observable ,当数据到达生产者,他就,第一时间将数据推到消费者手上。这种方式更加的可扩展,因为不用关心数据来自于异步还是同步消息。
以下例子展示了高阶函数可以被同时应用到 iterable 和 Obserable 上。
3456
Observable 类型从 “the Gang of Four’s Observer pattern” 中新增了两个语义,来兼容 iterable 的类型:
1、没有更多数据的可用,生产的也能够发射信号给消费者的能力( iterable 的循环结束之后,也能够返回值,Observer 在 onCompleted 方法中返回值)
2、有错误产生的时候,生产的也能够发射信号给消费者的能力(如果循环中出现错误,iterable 抛出一个异常;Observable 调用监听者的 onError 方法)
通过这个增加点,ReactiveX 能够和谐的将 iterable 和 Observable 类型合并。唯一的不同就是数据流的方向。现在,任何你在 iterable 上能够执行的错做,你都能够在 Observable 上执行。