结合 Rxjs 5 中的最新行为?

combineLatest behaviour in Rxjs 5?

正在查看 combineLatest

definition

Combines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables.

Whenever any input Observable emits a value, it computes a formula using the latest values from all the inputs, then emits the output of that formula.

可以很清楚地看到,在每个时间段/排放,该排放的结果是最新排放的组合。

如果是这样,请查看此代码

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

这是因为源 Observable 的值是同步发出的,除非您使用调度程序。这意味着第一个 obs1 发出所有值,只有最后一个值被 combineLatest 记住,然后 obs2 开始发出它的所有值(如果切换两个 Observables,同样适用)。现在 combineLatest 具有两个 Observable 的值,因此来自第二个 Observable 的任何发射都会使运算符发射一个值。

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

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