我试图了解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"]
试图弄清楚原因,我制定了这个简单的方案:
从文档中,我读到每次内部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"]
这显然是错的,但我没有发现我的错误,有人可以解释一下吗?
答案 0 :(得分:5)
考虑combineAll
:
当Observable-of-Observables完成时,通过应用
combineLatest
来展平Observable-of-Observable。
实际上会等待所有输入Observables至少发出一次。
所以combineAll
可观测量的第一次发射包括"内部1"的第一个值。直到"内部2"才能观察到。 observable发出它的第一个值。因此,只有九种排放 - 而不是十种。