结合 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
这是因为源 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 的最后一个参数。
正在查看 combineLatest
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
这是因为源 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 的最后一个参数。