RxJS结合所有运营商,解释

时间:2017-07-19 05:47:35

标签: rxjs observable combinelatest

我试图了解combineAll运算符的工作原理。 我使用官方文档中的以下示例:

const source = Rx.Observable.interval(1000).take(2);
const example = source.map(val => Rx.Observable.interval(1000).map(i => `Result (${val}): ${i}`).take(5));
const combined = example.combineAll();

然后输出:

["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"]

试图弄清楚原因,我制定了这个简单的方案:

combineAll Scheme

从文档中,我读到每次内部Observable都发出一个值时,这个发出的值就会被所有其他内部observable的最后一个值组合。

在上面的方案中,我们可以看到内部Observables在时间内发出了10个值,所以我希望随着时间的推移得到10个值的输出,但它是9。

另外,在输出的第一行:

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

'结果(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"]

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

1 个答案:

答案 0 :(得分:5)

考虑combineAll

  当Observable-of-Observables完成时,

通过应用combineLatest来展平Observable-of-Observable。

combineLatest;

  

实际上会等待所有输入Observables至少发出一次。

所以combineAll可观测量的第一次发射包括"内部1"的第一个值。直到"内部2"才能观察到。 observable发出它的第一个值。因此,只有九种排放 - 而不是十种。