我有两个要与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
才发出一个值。
如果我切换了移交o1
和o2
的顺序,则按预期进行:
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
的定义矛盾。
答案 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)
。
它非常安全并且易于阅读-当我回顾旧代码时,我发现它很难阅读。请注意,在上面的示例中,我故意将参数以不同的顺序放置,这样做没有问题。
为什么我不知道这不是主库的一部分!