【问题标题】:combineLatest behaviour in Rxjs 5?结合 Rxjs 5 中的最新行为?
【发布时间】:2017-09-23 00:45:25
【问题描述】:

查看combineLatestdefinition

组合多个 Observable 来创建一个 Observable,其值是 根据每个输入 Observable 的最新值计算得出。

当任何输入 Observable 发出一个值时,它都会计算一个公式 使用所有输入的最新值,然后发出 那个公式。

很明显,在每个时间段/排放量中,该排放量的结果是最新排放量的组合。

如果是这样,看看这段代码

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

当我交换订单时(obs1obs2):

[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

【问题讨论】:

    标签: javascript rxjs rxjs5 combinelatest


    【解决方案1】:

    这是因为来自源 Observable 的值是同步发出的,除非你使用调度器。这意味着第一个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 作为最后一个参数添加到两个源 Observables。

    【讨论】:

    • 那么 rx4 会发出不同的结果吗?
    • 我认为 RxJS 4 默认使用所谓的 immediate 调度程序,因此结果很可能与 rxJS 5 不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多