2017-04-25 52 views
2

望着definitioncombineLatestcombine在Rxjs 5中的最大行为?

结合多种观测量,以创建一个可观察其值 从它的每个输入观测值的最新值来计算。

每当任何输入可观察发出的值,它使用从所有输入的最新值计算出一个公式 ,然后发射的 ,式输出。

enter image description here

,很明显地看到,在时间/发射的每一个时期,在这个发射的结果是最新排放的组合。

如果是这样,看着这个代码

const obs1 = Rx.Observable.of(1, 2, 3, 4, 5); 
const obs2 = Rx.Observable.of('a', 'b', 'c') 
const obs3 = obs2.combineLatest(obs1, (a, b) => a+b); 

const subscribe = obs3.subscribe(latestValues => { 
    console.log(latestValues ); 
}); 

结果是:

c1,c2,c3,c4,c5 

当我改变

obs2.combineLatest(obs1.. 

obs1.combineLatest(obs2.. 

- 我得到5a,5b,5c

问:

的文档没有指定有关调用的顺序有什么区别(如果有的话 - 为什么我得到不同的结果)?为什么我看不到其他来源的其他组合?似乎有一个来源正在取其最后一个值,然后只有 - 将它加入来自其他来源的每个值。

好像这是什么实际发生的事情:

[other source]---a---b---c------------------------ 
[first source]-------------1----2-----3-----4----5 
[result]-------------------c1---c2----c3----c4---c5 

当我换的顺序(OBS1 < - > OBS2):

[first source]-----1--2---3--4--5---------------- 
[other source]---------------------a-----b------c 
[result]---------------------------5a----5b-----5c 

这是怎么回事?为什么一个流必须完成才能启动连接?

为什么我没有看到这样的事情(或变化):

[first source]-----1-----2--------3-------4------5--- 
[other source]---------a-----b------c---------------- 
[result]---------------1a------2b------3b---4c-------5c 

JSBIN

回答

3

这是因为从源观测量值,除非您使用调度同步emited。这意味着第一个obs1发射所有值,只有最后一个被combineLatest记住,并且obs2开始发射其所有值(如果切换两个可观测量,则相同应用)。现在combineLatest具有两个观测值的值,所以来自第二观测值的任何辐射都会使操作员发出一个值。

为什么它的工作原理是因为Observable.of在内部实现为ArrayObservable,默认情况下它不使用任何调度程序。这意味着它的所有排放都是同步发生的。请参见https://github.com/ReactiveX/rxjs/blob/master/src/observable/ArrayObservable.ts#L118

顺便说一句,您可以将Rx.Scheduler.async作为最后一个参数添加到两个源Observable中。

+0

那么rx4会发出不同的结果? –

+0

我认为RxJS 4默认使用所谓的* immediate * scheduler,所以结果很可能与rxJS 5不同。 – martin