组合在一起的可观察对象的顺序是否相关?

时间:2018-08-03 16:27:13

标签: rxjs reactive

我有两个要与combineLatest结合使用的观测值:

const o1 = from(['a', 'b', 'c']);
const o2 = of('content from o2');
combineLatest(o1, o2)
  .subscribe(result => console.log(result));

据我了解combineLatest,当发出任何可观察物时,它将结合所有可观察物的最新值并发出它们:

  

当任何可观察对象发出一个值时,请从每个观察对象中发出最新的值。   (https://www.learnrxjs.io/operators/combination/combinelatest.html

但是,使用上面的代码,输出为:

["c", "content from o2"]

因此,只有当o2发出时,combineLatest才发出一个值。

如果我切换了移交o1o2的顺序,则按预期进行:

const o1 = from(['a', 'b', 'c']);
const o2 = of('content from o2');
combineLatest(o2, o1)
  .subscribe(result => console.log(result));

输出:

["content from o2", "a"]
["content from o2", "b"]
["content from o2", "c"]

这是预期的行为吗?如果是这样,为什么?这似乎与combineLatest的定义矛盾。

2 个答案:

答案 0 :(得分:2)

是的,在这种情况下顺序很重要,但这是时间问题。 CombineLatest不能影响可观察值的发出顺序。

在第一种情况下,o1会先发出所有值,然后o2会发出其值。在第二种情况下,o2首先发出其值,然后o1发出其所有值。在现实世界中,您会自然地延迟可观察值(服务调用等),因此通常顺序并不重要。

答案 1 :(得分:0)

我无法强调@cartant从rxjs-etc发现combineLatestObject的有用性。

您为对象提供了命名的Observables,然后获得了具有命名值的对象,而不是返回数组。

combineLatestObject({

   isRaining: this.isRaining$,
   isSnowing: this.isSnowing$

}).pipe(map(({ isSnowing, isRaining }) => {

   return (isSnowing ? "It's snowing " : "It isn't snowing ") + "and " +
          (isRaining ? "it's raining " : "it isn't raining");

});

map()switchMap()内,您可以像在此那样对对象进行解构,或者仅提供一个参数即可访问值map(data => data.isSnowing)

它非常安全并且易于阅读-当我回顾旧代码时,我发现它很难阅读。请注意,在上面的示例中,我故意将参数以不同的顺序放置,这样做没有问题。

为什么我不知道这不是主库的一部分!