RxJS字面意思就是:JavaScript的响应式扩展(Reactive Extensions for JavaScript)。
RxJS是一个利用可观察(observable)序列和LINQ查询操作符来处理异步以及基于事件程序的一个库。通过RxJS, 开发人员用Observables来表示 异步数据流,用LINQ运算符查询 异步数据流,并使用Schedulers参数化 异步数据流中的并发。简而言之,Rx = Observables + LINQ + Schedulers。
无论你在用 Node.js编写一个web端应用还是服务端应用,你都必须经常处理异步和基于事件的编程。Web应用程序和Node.js应用程序都会碰到I / O操作和计算耗时的任务,这些任务可能需要很长时间才能完成,并可能会阻塞主线程。而且,处理异常,取消和同步也很麻烦,并且容易出错。
使用RxJS,你可以用Observer
对象来表示多个异步数据流 (那些来自多个数据源的,比如,股票报价,微博,计算机事件, 网络服务请求,等等。),还可以用Observer
对象订阅事件流。无论事件何时触发,Observable
对象都会通知订阅它的 Observer
对象。
因为可观察序列是数据流,你可以用Observable的扩展方法实现的标准查询运算符来查询它们。从而,你可以使用这些标准查询运算符轻松筛选,投影(project),聚合,撰写和执行基于时间轴(time-based)的多个事件的操作。此外,还有一些其他反应流特定的操作符允许强大的查询写入。 通过使用Rx提供的扩展方法,还可以正常处理取消,异常和同步。
RxJS可与诸如数组,集合和映射之类的同步数据流以及诸如Promises之类的单值异步计算进行互补和顺畅的互操作,如下图所示:
单返回值 | 多返回值 | |
---|---|---|
Pull/Synchronous/Interactive | Object | Iterables (Array / Set / Map / Object) |
Push/Asynchronous/Reactive | Promise | Observable |
推送模式 vs 拉取模式
在交互式编程中,应用程序为了获取更多信息会主动遍历一个数据源,通过检索一个代表数据源的序列。这种行为就像是JavaScript数组,对象,集合,映射等的迭代器模式。在交互式编程中,必须通过数组中的索引或通过ES6 iterators来获取下一项。
在拉取模式中,应用程序在数据检索过程中处于活动状态: 它通过自己主动调用next来决定检索的速度。 此枚举模式是同步的,这意味着在轮询数据源时可能会阻止您的应用程序的主线程。 这种拉取模式好比是你在图书馆翻阅一本书。 你阅读完成这本书后,你才能去读另一本。
另一方面在响应式编程中,应用程序通过订阅数据流获得更多的信息 (在RxJS中称为可观测序列),数据源的任何更新都传递给可观测序列。这种模式下应用是被动接收数据:除了订阅可观察的来源,并不会主动查询来源,而只是对推送给它的数据作出反应。事件完成后,信息来源将向用户发送通知。这样,您的应用程序将不会被等待源更新阻止。
这是RxJS采用的推送模式。 这好比是加入一个图书俱乐部,在这个图书俱乐部中你注册了某个特定类型的兴趣组,而符合你兴趣的书籍在发布时会自动发送给你。 而不需要排队去搜索获取你想要的书籍。 在重UI应用中,使用推送数据模式尤其有用,在程序等待某些事件时,UI线程不会被阻塞,这使得在具有异步要求的JavaScript运行环境中非常重要。 总之,利用RxJS,可使应用程序更具响应性。
由Observable
/ Observer
的可观察模式就是Rx实现的推送模型。 Observable
对象会自动通知所有观察者状态变化。 请使用Observable
的subscribe
方法来订阅,subscribe
方法需要Observer
对象并返回Disposable
对象。 这使您能够跟踪您的订阅,并能够处理订阅。 您可以将可观察序列(如一系列的鼠标悬停事件)视为普通的集合。 RxJS对可观察序列的内置实现的查询,允许开发人员在基于推送序列(如事件,回调,Promise,HTML5地理定位API等等)上组合复杂的事件处理。有关这两个接口的更多信息,请参阅探索 RxJS的主要概念。