欢迎指导与讨论 :)

  前言

    本文是笔者翻译 RxJS 5.X 官网各类operation操作系列的的第三篇 —— Combination组合与Multicasting广播。如有错漏,希望大家指出提醒O(∩_∩)O。更详细的资料尽在rxjs官网 【http://reactivex.io/rxjs/manual/overview.htm】与带有demo例子的网站【http://xgrommx.github.io/rx-book/content/observable】。

    本文有关Combination操作的内容有:combineAll、combineLastest、concat、cancatAll、exhaust、forkJoin、merger、mergeAll、race、startWith、switch、withLastestFrom、zip、zipAll

    有关Multicasting操作的内容有:cache、multicast、publish、publishBehavior、publishLast、publishReplay、share

  一、combineAll

    将高阶Observable转化为一阶。当外层Observable结束时,对每个内层Observable使用combineLastest,并最终以数组项的形式返回每个内层Observable的最新值。

// 点击三次后,外层Observable结束
// 然后对三个内层Observable使用combineLastest
Rx.Observable.fromEvent( document, 'click')
.map( ev => Rx.Observable.of( 1, 2, 3 ))
.take( 3 )
.combineAll( )
.subscribe( x => console.log( x ));
// 输出 [ 3, 3, 1 ], [ 3, 3, 2 ], [ 3, 3, 3]

  二、combineLastest

    每当其中一个Observable发射值时,都会以数组的形式发射两个Observable的最新值。

Rx.Observable.interval( 1000 )
.combineLatest( Rx.Observable.timer( 1000 , 2000 ))
.subscribe( x => console.log( x ));
// 输出 [ 0, 0 ], [ 1, 0 ], [ 2, 1 ], [ 3, 2 ]...

  三、concat

    链式拼接两个Observable的结果

Rx.Observable.of( 1, 2, 3 )
.concat( 'a', 'b', 'c' )
.subscribe( x => console.log( x ));
// 输出:1,2,3,a,b,c

  四、cancatAll

    将高阶Observable转化为一阶。并将结果以链式拼接的形式进行发射。

Rx.Observable.fromEvent( document, 'click')
.mapTo( Rx.Observable.interval( 1000 ).take( 3 ))
.concatAll( )
.subscribe( x => console.log( x ));
// 点击三次,则输出:0 1 2, 0 1 2, 0 1 2

  五、exhaust

    将高阶Observable转化为一阶。并将结果以链式拼接的形式进行发射。但是,当前一个内层Observable的值还没有发射完毕时,不会接受下一个内层Observable,并不会把它的值拼接到外层Observable中。

Rx.Observable.fromEvent( document, 'click')
.mapTo( Rx.Observable.interval( 1000 ).take( 3 ))
.exhaust( )
.subscribe( x => console.log( x ));
// 在值被发射时,点击不会产生新的Observable并进行值的拼接

  六、forkJoin 

    将多个Observable进行并行计算,并数组的形式返回它们各自的最新值

Rx.Observable.forkJoin(
Rx.Observable.of(42),
Rx.Observable.range(0, 10),
Rx.Observable.of(1,2,3)
)
.subscribe( x => console.log( x ))
// 输出: [ 42, 10, 3 ]

  七、merger

    将两个Observable进行合并,每当其中一个Observable发射值时,都会被外层Observer所收到。

Rx.Observable.fromEvent( document, 'click' )
.merge( Rx.Observable.interval( 1000 ))
.subscribe( x => console.log( x ));
// 不点击的情况下,每秒输出i, i为从零到n
// 点击一下,马上输出 $mouseEvent

  八、mergeAll

    将多个Observable进行合并,每当其中一个Observable发射值时,都会被外层Observer所收到。

Rx.Observable.fromEvent( document, 'click' )
.mapTo( Rx.Observable.interval( 1000 ))
.mergeAll( )
.subscribe( x => console.log( x ));
// 每次点击,新增一个计时器,并把它合并到同一个流中

  九、race —— 暂无

  十、startWith

    在源Observable开头插入一个指定的值

Rx.Observable.interval( 1000 )
.startWith( 123 )
.subscribe( x => console.log( x ));
// 输出:123, 1, 2, 3,....

  十一、switch

    将高阶Observable转化为一阶Observable。当生成新的内层Observable时,外层流会丢弃上一个内层Observable,并发射新的内层Observable的一系列的值,并重复上述过程。既有,重新开始的意思。

Rx.Observable.fromEvent( document, 'click' )
.mapTo( Rx.Observable.interval( 1000 ))
.switch( )
.subscribe( x => console.log( x ));
// 每次点击会重新输出:0,1,2,3,4,5....

  十一、withLastestFrom

    每当源Observable发射新的值时,会以数组的形式,把源Observable和另一个Observable的最新值进行组合并发射。

Rx.Observable.fromEvent( document, 'click' )
.withLatestFrom( Rx.Observable.interval( 1000 ))
.subscribe( x => console.log( x ));
// 每次点击输出: [ MouseEvent, x ], x是计时器的最新值

  十二、zip

    组合多个Observable,并生成一个新的Observable,其值能够通过每个Observable的值,和自定义函数进行定义。

let age$ = Rx.Observable.of<number>(27, 25, 29);
let name$ = Rx.Observable.of<string>('Foo', 'Bar', 'Beer');
let isDev$ = Rx.Observable.of<boolean>(true, true, false); Rx.Observable
.zip(age$, name$, isDev$,
(age: number, name: string, isDev: boolean) => ({ age, name, isDev }))
.subscribe(x => console.log(x)); // 输出
// {age: 27. name: 'Foo', isDev: true }
// {age: 25. name: 'Bar', isDev: true }
// {age: 29. name: 'Bear', isDev: false}

  十三、zipAll —— 暂无

  十四、cache —— 暂无

  十五、multicast

    返回一个ConnectableObservable。每一个订阅了同一个Observable的observer,实际上是拥有不同的、独立的Observable的执行( 原文:each subscribed Observer owns an independent execution of the Observable ),而Subject是多播的。

var source = Rx.Observable.create((o)=>{
o.next(1);o.next(2);
});
var subject = new Rx.Subject();
var multicasted = source.multicast(subject); // 原理是`subject.subscribe({...})`:返回的multicasted是一个connectableObservable
multicasted.subscribe({next: (v) => console.log('observerA: ' + v)});
multicasted.subscribe({next: (v) => console.log('observerB: ' + v)}); // 原理是 `source.subscribe(subject)`:
multicasted.connect();
// observerA: 1 observerB: 1
// observerA: 2 observerB: 2

  十六、publish

    返回一个ConnectableObservable。可进行广播

var a$ = Rx.Observable.interval( 1000 )
.publish( ) a$.subscribe({next: (v) => console.log( v )});
a$.subscribe({next: (v) => console.log( v )}); a$.connect(); // 同时输出 1 1, 2 2, 3 3...

  十七、publishBehavior —— 暂无

  十八、publishLast 

       返回一个ConnectableObservable。且只广播该Observable的最后一个值

var a$ = Rx.Observable.of( 1, 3, 4, 5)
.publishLast( ) a$.subscribe({next: (v) => console.log('observerA: ' + v)});
a$.subscribe({next: (v) => console.log('observerB: ' + v)}); a$.connect( )
// 输出
// observerA: 5
// observerB: 5

  十九、publishReplay

       返回一个ConnectableObservable。且当第二个及以后才订阅这个ConnectableObservable时,只会受到最新的n个值,这个n由我们以参数的形式提供

var a$ = Rx.Observable.of(1,2,3,4,5)
.publishReplay( 3 )
.refCount( ) a$.subscribe({next: (v) => console.log('observerA: ' + v)});
a$.subscribe({next: (v) => console.log('observerB: ' + v)});
a$.subscribe({next: (v) => console.log('observerC: ' + v)}); // 输出
// observerA: 1 observerA: 2 observerA: 3 observerA: 4 observerA: 5
// observerB: 3 observerB: 4 observerB: 5
// observerC: 3 observerC: 4 observerC: 5

  二十、share

     返回一个可被共享的Observable。它是 .publish( ).refCount( )的另一种写法

var a$ = Rx.Observable.interval( 1000 )
.share( ) a$.subscribe({next: (v) => console.log( v )});
a$.subscribe({next: (v) => console.log( v )}); // 同时输出 1 1, 2 2, 3 3...

rxjs5.X系列 —— Combination/Multicasting系列 api 笔记的更多相关文章

  1. 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-cod ...

  2. 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api ...

  3. [Leetcode] Combination Sum 系列

    Combination Sum 系列题解 题目来源:https://leetcode.com/problems/combination-sum/description/ Description Giv ...

  4. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  5. C#开发BIMFACE系列6 服务端API之获取文件信息

    在<C#开发BIMFACE系列4 服务端API之源上传文件>.<C#开发BIMFACE系列5 服务端API之文件直传>两篇文章中详细介绍了如何将本地文件上传到BIMFACE服务 ...

  6. C#开发BIMFACE系列4 服务端API之源上传文件

    在注册成为BIMFACE的应用开发者后,要能在浏览器里浏览你的模型或者获取你模型内的BIM数据, 首先需要把你的模型文件上传到BIMFACE.根据不同场景,BIMFACE提供了丰富的文件相关的接口. ...

  7. C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用. BIMFACE ...

  8. C#开发BIMFACE系列7 服务端API之获取文件信息列表

    系列目录     [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...

  9. C#开发BIMFACE系列8 服务端API之获取文件上传状态信息

    系列目录     [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...

随机推荐

  1. 基于http.sys来开发的,真的是非常稳定

    真正的WEB服务器是不会用Indy写的.因为它是基于每连接每线程的. 其实真正的服务器需要下很多功夫,无法快速开发的.比如说,字符串处理.玩服务器基本上就是玩内存.举个例子: var str:Ansi ...

  2. D3D游戏编程系列(一):DXLib的介绍

    这篇文章里我准备向大家介绍下我封装的一个基础D3D库:DXLib.有了这样一个类库,可以减少很多无用功以及繁琐的工作,使我们的效率大大提高. DXLib.h #define DIRECTINPUT_V ...

  3. Redpine Signals RS9110-N-11-02 Wi-Fi解决方案

    Redpine Signals公司的RS9110-N-11-02是兼容IEEE 802.11bgn的Wi-Fi客户端模块,集成了MAC,基带处理器,RF收发器和功率放大器.和RS9110-LI MAC ...

  4. 【HDOJ】3828 A + B problem

    显然需要贪心,重叠越长越好,这样最终的串长尽可能短.需要注意的是,不要考虑中间结果,显然是个状态dp.先做预处理去重,然后求任意一对串的公共长度. /* 3828 */ #include <io ...

  5. ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引

    ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引       因为表KOL_XX_FIN050_TEMP 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba ...

  6. Python中的抽象超类

    # -*- coding:utf-8 -*- class Super(object): def test(self): self.action() class Sub(Super): def acti ...

  7. C++中const小结

    1.const修饰普通变量(非指针变量)const修饰变量,一般有两种写法:const TYPE value;TYPE const value;对于一个非指针的类型TYPE,这两种写法在本质上是一样的 ...

  8. Maven相关内容学习笔记一:基本配置和使用

    首先必须推荐的这本书<Maven实战> 许晓斌,机械工业出版社 Maven简介 其实使用Maven也有很久时间了,大部分都是别人建好了工程我使用一下,实际上并没有非常详细的使用经验,这次到 ...

  9. poj2761

    表面上看是主席树之类的区间k大 实际上,除了主席树,还可以测各种结构 因为题目中说,任意区间不会完全包含 于是,我们把区间按左端点排序,依次添加,用平衡树求当前的k大 每个狗最多被添加一次,删除一次 ...

  10. 深入理解Arrays.sort()

    两种方法: 1.类本来就实现java.lang.Comparable接口,使类本身就有比较能力.接口实现compareTo方法,次方法接收另一个Object为参数,如果当前对象小于参数则返回负值,如果 ...