RxJS combineAll 运算符,解释

RxJS combineAll Operator, explanation

我想了解 combineAll 运算符是如何工作的。 我正在使用 official documentation 中的以下示例:

import { take, map, combineAll } from 'rxjs/operators';
import { interval } from 'rxjs';

const source$ = interval(1000).pipe(take(2));

const example$ = source$.pipe(
  map(val =>
    interval(1000).pipe(
      map(i => `Result (${val}): ${i}`),
      take(5)
    )
  )
);

example$
  .pipe(combineAll())
  .subscribe(console.log);

然后输出是:

["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 1"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 2", "Result (1): 2"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 3", "Result (1): 3"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]

为了找出原因,我做了这个简单的方案:

我从文档中了解到,每次任何内部 Observable 发出一个值时,这个发出的值都会与所有其他内部 Observable 的最后一个值相结合。

在上面的方案中,我们可以看到内部 Observables 在一段时间内发出了 10 个值,所以我期望在一段时间内得到一个具有 10 个值的输出,但它是 9。

此外,在输出的第一行:

["Result (0): 0", "Result (1): 0"]) 

'Result (1): 0'的0是否对应空值?因为 Observable 'inner 2' 还没有发射任何东西?

到此结束是我所期望的输出:

["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 2", "Result (1): 0"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 3", "Result (1): 1"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 4", "Result (1): 2"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]

明显是错误的,但是我没有发现我的错误,谁能解释一下?

考虑 combineAll:

flattens an Observable-of-Observables by applying combineLatest when the Observable-of-Observables completes.

还有那个 combineLatest;

will actually wait for all input Observables to emit at least once.

因此,combineAll 可观察对象的第一个发射包含 "Inner 1" 可观察对象的第一个值不会发生,直到 "Inner 2" 可观察对象发出其第一个值。所以只有九次排放 - 而不是十次。