RxJS结合所有运营商,解释

Bil*_*il5 5 observable rxjs combinelatest

我试图理解combineAll运算符是如何工作的.我正在使用官方文档中的以下示例:

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);

Run Code Online (Sandbox Code Playgroud)

输出是:

["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"]
Run Code Online (Sandbox Code Playgroud)

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

结合所有方案

从文档中,我读到每当内部Observable中的任何一个发出一个值时,这个发出的值就会被所有其他内部可观察量的最后一个值组合起来.

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

另外,在输出的第一行:

["Result (0): 0", "Result (1): 0"]) 
Run Code Online (Sandbox Code Playgroud)

'Result(1):0'的0是否对应空值?因为Observable'内部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"]
Run Code Online (Sandbox Code Playgroud)

这显然是错的,但我没有发现我的错误,有人可以解释一下吗?

car*_*ant 6

考虑一下combineAll:

通过combineLatest在Observable-of-Observable完成时应用,展开Observable-of-Observable.

那combineLatest;

实际上会等待所有输入的Observable发出至少一次.

因此combineAll,包含"内部1"可观测量的第一个值的可观测量的第一个发射在"内部2"可观测量发出其第一个值之前不会发生.所以只有九个排放 - 而不是十个.