使用Browserify,我们可以使用Node.js的模块加载器,它将明智地包含哪些依赖项,使代码下载尽可能小。...驱动程序采用从我们的应用程序发出数据的Observable,它们返回另一个导致副作用的Observable。...到目前为止,我们有生成UI的功能和从该UI检索用户输入的功能。我们现在需要添加将从维基百科获取信息的功能。...我们使用JSONP而不是HTTP来更容易在本地计算机上运行此示例,因为使用HTTP从不同的域检索数据会导致某些浏览器因为安全原因阻止这些请求。...在几乎任何其他情况下,尤其是在生产代码中,使用HTTP来检索远程数据。 无论如何,使用JSONP并不影响本章的要点。
); Reduce reduce(也称为fold)接受一个Observable并返回一个始终包含单个项的新项,这是在每个元素上应用函数的结果。...,它使用XMLHttpRequest从URL检索内容。...我们首先要创建一个Observable来检索数据集并发出单个地震。...我们将使用Rx.Observable.from检索数据并从features数组中生成一个Observable。...interval创建一个Observable,每隔五秒发出一个递增的数字。我们对这些数字没有做任何事情; 相反,我们使用flatMap来检索jsonpRequest的数据。
first() 只发射第一个数据项,或者是满足条件的第一个数据项。 ?...它也是将多个Observable的发射项结合在一起,而且是真正的结合,严格按照顺序组合发射项,然后一一发送。如1和A组成1A,2和B组成2B。...最终发射项的个数等于之前的最少发射项的Observable的发射项个数。...doOnEach() 注册一个回调,Observable每发送一次数据项,它都将被调用,可以传递Notification参数或者Obsever参数给它的onNext()方法。...我们都知道所谓三级缓存其实就是 内存 memorycache 硬盘 diskcache 网络 networkdata 程序首先去检索内存中是否缓存数据,如果有则取内存数据。
我将通过使用 RxJava,来实现这个计划。 基本模式 为每一个数据源(网络,磁盘和内存)创建Observable,使用concat()和first()操作符,构造一个简单的实现方式。...concat()操作符持有多个Observable对象,并将它们按顺序串联成队列。 first()操作符只从串联队列中取出并发送第一个事件。...因此,如果使用concat().first(),无论多少个数据源,只有第一个事件会被检索出并发送。...注意concat()所持有的Observable数据源,是按照一个接一个的顺序被检索的。 持久化数据 很明显,下一步是缓存数据。...因此,只要有一个数据源的数据过期,就继续检索下一个数据源,直到找到最新数据为止。
这个程序需要通过单击按钮检索来自不同来源的数据,它具有以下要求: 它必须统一来自使用不同源的JSON结构 最终结果不应包含任何副本 为了避免多次请求数据,用户不能重复点击按钮 使用RxJS,我们的代码类似这样...使用Observable进行Ajax调用 我们还没有对Observables做过任何实用的事情。如何创建一个检索远程内容的Observable?...从数组创建Observable 我们可以使用通用的operators将任何类似数组或可迭代的对象转换为Observable。 from将数组作为参数并返回一个包含他所有元素的Observable。...这些专门的Observable只包含原始的过滤项:movesOnTheRight包含发生在屏幕右侧的鼠标事件,movesOnTheLeft包含发生在左侧的鼠标事件。...从回调函数创建Observable 如果您使用第三方JavaScript库,则可能需要与基于回调的代码进行交互。
下面这条线是变换的结果,也就是输出,同样各种颜色的块块是要观察的结果的项,xx表示异常中断。 2.2 第一次体验Rx 需求如下: 从输入框获取输入,从第 10 次输入开始取前5次的输入,打印出来。...map — 映射,通过对序列的每一项都应用一个函数变换 Observable 发射的数据,实质是对序列中的每一项执行一个函数,函数的参数就是这个数据项 scan — 扫描,对 Observable...发射的每一项数据应用一个函数,然后按顺序依次发射这些值 window — 窗口,定期将来自 Observable 的数据分拆成一些 Observable 窗口,然后发射这些窗口,而不是每次发射一项。...distinct —去重,过滤重复数据 element_at — 取值,发射某一项数据 filter — 过滤,仅发射 Observable 中通过检测的项 first — 首项,只发射第一项...zip — 使用一个函数组合多个 Observable 发射的数据集合,然后再发射这个结果。
,可以简单理解为缓存,它定期从 Observable 收集数据到一个集合,然后把这些数据集合打包发射,而不是一次发射一个; Catch:捕获,继续序列操作,将错误替换为正常的数据,从 onError 通知中恢复...; Empty/Never/Throw:创建行为受限的特殊 Observable; Filter:过滤,过滤掉没有通过谓词测试的数据项,只发射通过测试的 First:首项,只发射满足条件的第一条数据;...Observable; Join:无论何时,如果一个 Observable 发射了一个数据项,只要在另一个 Observable 发射的数据项定义的时间窗口内,就将两个 Observable 发射的数据合并发射...; Just:将对象或者对象集合转换为一个会发射这些对象的 Observable; Last:末项,只发射最后一条数据; Map:映射,对序列的每一项都应用一个函数变换 Observable 发射的数据...发射的是数据,Window 发射的是 Observable,每一个 Observable 发射原始 Observable 数据的一个子集; Zip:打包,使用一个指定的函数将多个 Observable
参数如下:value: 来自源的值;index: 来自投射的 Observable 的值的 "index"(从0开始);source: 源 Observable 自身实例。...,它发出由源 Observable 所发出的所有与之前的项都不相同的项。...发出数字(或可以与提供的函数进行比较的项)并且当源 Observable 完成时它发出单一项:最大值的项。...发出数字(或可以使用提供函数进行比较的项)并且当源 Observable 完成时它发出单一项:最小值的项。...参数: 名称 类型 属性 描述 count number 从源 Observable 的值序列的末尾处,要发出的值的最大数量。
这是背后发生的事情: 遍历数组并创建一个包含所有项大写的新数组。 遍历大写数组,创建另一个包含1,000个元素的数组。 遍历筛选的数组并将每个结果记录到控制台。...在最终结果中,我们获取Subject自己的消息,然后从源Observable获取代理值。来自Observable的值后来因为它们是异步的,而我们立即使Subject的自己的值。...每次Observer订阅Observable时,它实际上都会订阅AsyncSubject,它作为Observable检索URL和Observers之间的代理。...我们创建Observable来检索URL“products”并将其存储在products变量中。 这是第一个订阅,将启动URL检索并在检索URL时记录结果。 这是第二个订阅,在第一个订阅后运行五秒钟。...从SpaceShip Observable设置一个外部变量看起来比较简单,它会始终包含最后发出的x坐标,但这会破坏我们不成文的协议,永远不会改变外部状态!
另一方面,“冷”Observables从Observer开始订阅就发出整个值序列。 热Observable 订阅热Observable的Observer将接收从订阅它的确切时刻发出的值。...如果我们希望Observers共享相同的序列,我们需要一个热的Observable。 从冷到热使用publish 我们可以使用publish将冷的Observable变成热的。...对于下一个示例,我们将使用`share·运算符,当Observers的数量从0变为1时,它自动创建对Observable的预订。...一旦在父项上触发了事件,我们就可以使用事件的target属性来查找作为事件目标的子元素。...检索和发送推文 我们正在使用Node.js twit的流式Twitter客户端连接到Twitter和搜索推文。
然后通过学号检索出学生的详细情况。现在我们就要做这样的工作,通过学号找出学生,然后在屏幕上显示学生名字。...map() Observable.create(new Observable.OnSubscribe() { @Override public void...对象替换了一个新的Observable对象,然后由这个新的Observable对象来对接Subscriber,而这一切都神不知鬼不觉的,所谓移花接木。...只发射指定个数的数据项。...可以过滤我们不需要处理的数据项,阻止它们的发射。在这里也直接贴官网文档。
@Override protected UserAccount run() { /* 模拟执行网络调用以检索用户信息 */ try { Thread.sleep...* * @return R * 如果command由于任何原因失败,则执行 #run 或从 #getFallback() fallback的结果....* * @throws HystrixRuntimeException * 如果发生故障并且无法检索fallback * @throws...* 不会抛出异常,而只是切换为同步执行,因此无需更改代码即可 将command从运行在单独的线程切换到调用线程..../* 这是一个有状态的对象,因此只能使用一次 */ if (!
count操作符 count操作符用来对源Observable流的数据项进行计数,最后将总数弹射出来;如果源流弹射错误,就会将错误直接报出来;在源Observable流没有终止前,count操作符是不会弹射统计数据的...源流转换成一个弹射单个值的Observable输出流,输出流的唯一数据项的值为原始Observable流所弹射的数据项数量。...在上面的代码中,为了获取count输出流中的数据项,使用了toBlocking()和single()两个操作符。...BlockingObservable.single()方法表示阻塞当前线程,直到从封装的源Observable获取到唯一的弹射数据元素项,如果Observable源流弹射出的数据元素不止一个,single...reduce操作符 Reduce(归约)操作符对一个Observable流序列的每一项应用一个归约函数,最后将流的最终归约计算结果弹射出去。
即将涉及到observable转换的时候,从队列中取出将要消费的事件,不可能一直是我们需要的格式或者形状,可能每个值都需要扩展成更丰富的对象或者化作更多的值。...为了达到目的,我们可以为每一个observable的返回值使用一个这样的方法函数,使用它可以将所有已发送的事件转换成各种Observable,并最终合并结果。...问题 我需要从数据库检索出一组数值,然后每个数值都要调用这样的一个方法,它不仅支持异步转换,还能维持之前的输出顺序。最后,将他们转换成UI展示所需的列表。...然而蛋疼的是,结果并不是我想要的,因为:我使用了一个不能维持元素顺序的操作符 Observable.flatMap()。 简单示例 让我用一个简单示例演示上面提到的事情。...flatMap()操作符使用你提供的原本会被原始Observable发送的事件,来创建一个新的Observable。而且这个操作符,返回的是一个自身发送事件并合并结果的Observable。
execute()—该方法是阻塞的,从依赖请求中接收到单个响应(或者出错时抛出异常)。 queue()—从依赖请求中返回一个包含单个响应的Future对象。...observe()—订阅一个从依赖请求中返回的代表响应的Observable对象。...但是请注意,线程成本的开销增加远小于单独线程(网络请求)从2跳到28而执行时间从0跳到9的增加。...请求合并 您可以使用请求合并器(HystrixCollapser是抽象父代)来提前发送HystrixCommand,通过该合并器您可以将多个请求合并为一个后端依赖项调用。...整个请求的数据检索是一致的。 每次执行该命令时,不再会返回一个不同的值(或回退),而是将第一个响应缓存起来,后续相同的请求将会返回缓存的响应。 消除重复的线程执行。
1.distinct操作符 过滤掉重复的数据项,只让还没有发送过数据项通过。 ?...{ Log.e(TAG,s); } }); 运行结果: 2 11111 elemntAt(1)发射第二项数据...;elementAtOrDefault(11,”11111”),由于observable没有11找个索引元素,所以发送了默认的11111 3.first操作符 只发射第一项数据或者满足条件的第一项数据,...如果你需要第一项数据,或者满足条件的第一项数据,可以使用该操作符 ?...Log.e(TAG,aLong+""); } }); 运行结果: 6 13 …. observal 每300ms发射一个从0
Community community) { System.out.println(community.name); } }); Take take(int)用一个整数n作为一个参数,从原始的序列中发射前...如果第二个Observable发射了一项数据或者发射了一个终止通知,takeUntil()返回的Observable会停止发射原始Observable并终止。...通常我们用来结合RxBing(Jake Wharton大神使用RxJava封装的Android UI组件)使用,防止button重复点击。...过滤掉一段数字中的重复项: Observable.just(2, 1, 2, 2, 3, 4, 3, 4, 5, 5) .distinct() .subscribe(new...发射的当前数据项和前一个数据项是否相同。
debounce](https://box.kancloud.cn/401d51d142852785a558f9eb59212243_1508x584.png) `Debounce`操作符会过滤掉发射速率过快的数据项。...注意:这个操作符会会接着最后一项数据发射原始Observable的`onCompleted`通知,即使这个通知发生在你指定的时间窗口内(从最后一项数据的发射算起)。...* Javadoc: [throttleWithTimeout(long,TimeUnit)](http://reactivex.io/RxJava/javadoc/rx/Observable.html...的每一项应用一个函数进行限流,这个函数返回一个Observable。...如果原始Observable在这个新生成的Observable终止之前发射了另一个数据,`debounce`会抑制(suppress)这个数据项。
必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些observable值改变的时候,这些UI元素就会自动更新。...你应该使用如下的view model来代表你的这些信息: var viewModel = { serverTime: ko.observable(), numUsers...由于view model属性是observable的,在他们变化的时候,KO会自动更新绑定的HTML元素。 接下来,从服务器获取最新的数据。...数组也被转换成了observable数组,如果服务器更新改变了数组的个数,mapping插件也会添加或者删除相应的item项,也会尽量保持和原生JavaScript数组相同的order顺序。...里destroy一个item项的时候会生成这个属性。
领取专属 10元无门槛券
手把手带您无忧上云