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)
这显然是错的,但我没有发现我的错误,有人可以解释一下吗?
考虑一下combineAll:
通过
combineLatest在Observable-of-Observable完成时应用,展开Observable-of-Observable.
实际上会等待所有输入的Observable发出至少一次.
因此combineAll,包含"内部1"可观测量的第一个值的可观测量的第一个发射在"内部2"可观测量发出其第一个值之前不会发生.所以只有九个排放 - 而不是十个.
| 归档时间: |
|
| 查看次数: |
4986 次 |
| 最近记录: |