ReactiveX
ReactiveX是一个通过使用可观察序列组合异步和基于事件的程序的库。它扩展了observer模式以支持数据和/或事件序列,并添加了操作符,允许您在抽象底层线程、同步、线程安全、并发数据结构和非阻塞I/O等问题的同时以声明的方式组合序列
observable是访问多个条目异步序列的理想方法,它填补了这个空白
它有时被称为“函数式反应式编程”,但这是一个不恰当的称呼。ReactiveX可能是功能性的,也可能是反应性的,但“功能性反应编程”是另一种动物。一个主要的不同点是,函数式反应式编程作用于随时间不断变化的值,而ReactiveX作用于随时间发出的离散值。(参见Conal Elliott关于函数式反应编程的更精确信息)。
为什么使用 Observables?
ReactiveX可观察模型允许您使用与数组等数据项集合相同的简单可组合操作来处理异步事件流。它将您从错综复杂的回调网络中解放出来,从而使您的代码更易于阅读,更不易出现错误。
Observables 是可组合
像Java Futures这样的技术可以直接用于单个级别的异步执行,但是当它们被嵌套时,它们开始增加了不小的复杂性。
使用future来优化组合条件异步执行流是困难的(或者是不可能的,因为每个请求的延迟在运行时是不同的)。当然,这是可以做到的,但是它很快就变得复杂(从而容易出错),或者过早地阻塞Future.get(),这就消除了异步执行的好处。
ReactiveX可观察对象用于组合异步数据流和序列。
Observables 是灵活的
ReactiveX Observables不仅支持单个标量值的发射(如Futures那样),还支持值序列甚至无限流的发射。Observable
是一个可用于任何这些用例的抽象。Observable具有与Iterable镜像相关的所有灵活性和优雅。
观察者的意见较少
ReactiveX不偏向某些特定的并发或异步性源。可以使用线程池,事件循环,非阻塞I / O,演员(例如来自Akka)或任何适合您的需求,风格或专业知识的实现来实现Observable。客户端代码将其与Observable的所有交互视为异步,无论您的底层实现是阻塞还是非阻塞,然而您选择实现它。
这个Observable是如何实现的?
而且重要的是:使用ReactiveX,您可以在以后改变主意,从根本上改变Observable实现的基本特性,而不会破坏Observable的使用者。
回调有自己的问题
回调有自己的问题
回调Future.get()
通过不允许任何阻塞来解决过早阻塞的问题。它们自然有效,因为它们在响应准备就绪时执行。
但与Futures一样,虽然回调很容易使用单级异步执行,但 嵌套组合使它们变得笨拙。
ReactiveX是一种多语言实现
ReactiveX目前以各种语言实现,以尊重这些语言的习语,并且快速添加更多语言。
反应式编程
ReactiveX提供了一组运算符,您可以使用它们来过滤,选择,转换,组合和组合Observable。这允许有效的执行和组合。
您可以将Observable类视为与Iterable等效的“推” ,这是一个“拉”。对于Iterable,消费者从生产者和线程中提取值,直到这些值到达。相比之下,对于Observable,只要值可用,生产者就会将值推送给消费者。这种方法更灵活,因为值可以同步或异步到达。
Observable类型为Gang of Four的Observer模式添加了两个缺少的语义,以匹配Iterable类型中可用的语义:
- 生产者向消费者发出信号表明没有更多可用数据的能力(Iterable上的foreach循环完成并在这种情况下正常返回; Observable调用其观察者的
onCompleted
方法) - 生产者向消费者发出错误信号的能力(如果在迭代期间发生错误,则Iterable抛出异常; Observable调用其观察者的
onError
方法)
通过这些添加,ReactiveX协调了Iterable和Observable类型。它们之间的唯一区别是数据流动的方向。这非常重要,因为现在您可以在Iterable上执行任何操作,您也可以在Observable上执行。