ReactiveX
ReactiveX 是一个基于一系列可观察的异步和基础事件编程组成的一个库。
它继承观察者模式,支持序列数据或者事件。更高级的用法允许你将如下的一些抽象概念操作一起联合使用,比如低线程,同步,线程安全,数据并发,非阻塞I/O流。
它通常被称为“函数响应式编程”,这是用词不当的。ReactiveX 可以是函数式的,可以是响应式的,但是和“函数响应式编程”是不同的概览。一个主要的不同点是“函数响应式编程”是对随着时间不停变化的值进行操作的,而ReactiveX是对超时提交产生的离散值上。
为什么使用Observables?
ReactiveX 可见模式允许你使用数组等数据项的集合来进行些异步事件流组合操作。它使你从繁琐的web式回调中解脱,从而能使得代码可读性大大提高,同时减少bug的产生。
Observables是可以进行一系列组合的
它技术上和Java Futures一样简单是直接当着一个异步执行使用的,但是当Futures被嵌套使用复杂度会大大增加。
很难直接使用Futures去优化条件异步执行流程。然而Observables可以。使用Future.get()马上使其变得复杂或者提前进入阻塞状态,使的异步执行的优点淡然无存。
ReactiveX Observables 是为了处理组合流和异步序列数据设计的。
Observables 数据是灵活的
ReactiveX Observables不单单支持单个标量的值(想Futures)的提交,同时还支持多值甚至是很多的数据流。Observables是一个单个抽像,能被用到一些用户场景中。Observable和Iterable一样运用灵活并且可以进行更加高雅的操作。
event Iterable (pull) Observable (push)
retrieve data T next() onNext(T)
discover error throwsExceptionon Error(Exception)
complete !hasNext() onCompleted()
Observables 是类型多变
并发、异步资源可以应用在ReactiveX中,Reactiviex可以当着一个线程池使用,甚至loops,非阻塞I/O线程使用,无论什么能够更好符合你的需要,风格、专长。客户端代码处理交互使用Observables进行异步处理,无论你潜在的操作是阻塞或者非阻塞都可以选择它来实现。
Observable 如何执行呢?
public Observable getData();
.作为调用者是否异步运行在同一个线程中?
.是否异步运行在不同的线程中?
.是否被划分在多种线程中并且顺序返回数据对于调用者?
.是否使用 Actor (or multiple Actors) 代替线程池?
.是否使用网络NIO(网络接口对象)通过loop异步进行网络异步访问?
.使用使用loop 来将工作线程从回调线程中剥离开?
回调函数存在问题
回调函数为了解决 Future.get()过早的阻塞问题是通过不允许执行任何阻塞的行为。这能处理很好因为执行的时候响应数据已经就绪了。
未来,回调函数能够简单通过单个级别的异步执行,然而通过嵌套就显得不灵活。
ReactiveX 是跨语言的
ReactiveX 当前被多种编程语言实现,它遵守各种语言惯用语,同时多种语言正在加入其中。
交互式编程
ReactiveX 提供操作符集合,你可以使用 filter, select, transform, combine, and compose Observables。这将形成有效执行和结构。
你可以将Observable类的“push”行为等价于iterable的“pull”。使用Iterable消费者拉取数据从生产者此时线程阻塞直到数据到达。相比之下Observable生产者上传数据给消费者无论何时只要数据可用。这个方式是非常灵活的,因为数据到达可以使用同步或者异步的方式。
Demo Iterator/Observable 相似处
Observable 类型 相对于the Gang of Four’s Observer pattern增加了2个缺失的语法,去匹配可用的Iterable 类型。
1.当前没有跟多可用数据时候生产者通知消费者的能力(onCompleted方法)
2.当前发生错误的时候生产者通知消费者的能力(onErro方法)
通过以上这些,ReactiveX使得Iterable和Observable类型一致。唯一的不同是数据流动的方向。这是非常重要的因为现在你在Iterable上面的一系列操作同样可以用Oberservable达到效果。
网友评论