提供给 combineLatest 的可观察对象的顺序是否相关?

fjc*_*fjc 6 rxjs reactive

我有两个可观察的对象,我想与之结合combineLatest

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

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

当任何 observable 发出一个值时,从每个 observable 发出最新的值。( https://www.learnrxjs.io/operators/combination/combinelatest.html )

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

["c", "content from o2"]
Run Code Online (Sandbox Code Playgroud)

所以只有在o2发出时,才会combineLatest发出一个值。

如果我切换我移交的顺序o1o2,它会按预期工作:

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

输出:

["content from o2", "a"]
["content from o2", "b"]
["content from o2", "c"]
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*ler 6

是的,在这种情况下顺序很重要,但这是一个时间问题。combineLatest 不能影响 observables 值的发出顺序。

在您的第一种情况下, o1 在 o2 发出其值之前发出所有值。在第二种情况下,o2 首先发出它的值,然后 o1 发出它的所有值。在现实世界的例子中,你有一个可观察值(服务调用等)的自然延迟,所以通常顺序无关紧要。