结合Rxjs 5中的最新行为?

时间:2017-04-25 20:18:59

标签: javascript rxjs rxjs5 combinelatest

查看combineLatest

definition
  

组合多个Observable以创建值为的Observable   根据每个输入Observable的最新值计算。

  

只要任何输入Observable发出一个值,它就会计算一个公式   使用来自所有输入的最新值,然后发出输出   那个公式。

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来源的每个值。

看起来这就是实际发生的事情:

[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

1 个答案:

答案 0 :(得分:4)

这是因为源Observable的值是同步发出的,除非您使用Scheduler。这意味着第一个obs1会发出所有值,只有最后一个值会被combineLatest记住,而obs2会开始发出所有值(如果切换两个Observable,则相同)。现在combineLatest具有两个Observable的值,因此来自第二个Observable的任何发射都将使操作符发出一个值。

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

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