javascript - 为什么我的 rxjs combineLatest 只输出 2 次?
问题描述
考虑以下 rxjs@5.5.11 代码:
{
const source1 = Rx.Observable.of(1, 2, 3);
const source2 = Rx.Observable.of(4, 5);
const combined = Rx.Observable.combineLatest(source1, source2);
const subscribe = combined.subscribe(([value1, value2]) => {
console.log(`value1 Latest: ${value1}`);
console.log(`value2 Latest: ${value2}`);
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.11/Rx.min.js"></script>
我想象这个结果会是这样的:
(发射 1 次并持续)
value1 Latest: 3
value2 Latest: 5
或者
(发出 3 次,每次持续发出)
value1 Latest: 1
value2 Latest: 4
value1 Latest: 2
value2 Latest: 5
value1 Latest: 3
value2 Latest: 5
但实际上是:
(发射 2 次,每次都持续)
value1 Latest: 3
value2 Latest: 4
value1 Latest: 3
value2 Latest: 5
为什么?
解决方案
这些可观察的都没有任何延迟。一旦您订阅,source1
将立即发出所有值1, 2, 3
。然后它订阅source2
并且它发出的每个值都与最新的值 , 相3
结合source1
。
在每个值之间添加一个微小的延迟将强制每个事件按顺序发出。React 甚至会遵守零延迟来强制执行此排序。结果是它将交替地从每个事件中获取一个事件:
{
const source1 = Rx.Observable.of(1, 2, 3)
.zip(Rx.Observable.timer(0, 0), (x, _) => x);
const source2 = Rx.Observable.of(4, 5)
.zip(Rx.Observable.timer(0, 0), (x, _) => x);
const combined = Rx.Observable.combineLatest(source1, source2);
const subscribe = combined.subscribe(([value1, value2]) => {
console.log(`value1 Latest: ${value1}`);
console.log(`value2 Latest: ${value2}`);
});
}
value1 Latest: 1
value2 Latest: 4
value1 Latest: 2
value2 Latest: 4
value1 Latest: 2
value2 Latest: 5
value1 Latest: 3
value2 Latest: 5
推荐阅读
- javascript - 如何在 React js 中创建页面 url 预览?
- regex - 使用正则表达式从 CDATA XML 标记中删除 <> 符号
- geospatial - Overpass QL 的查询大小限制
- javascript - 在 Jest 上显示成功消息日志
- math - Coq 新手:如何编译 .vo 文件并运行命令行?
- tfs - 带有 tfs 2015 构建集成的 sonarqube 8.9.2 - 可能吗?
- python - 使用 ctypes 访问 DLL 函数
- html - 如何让div停止移动其他div而不改变css中的位置?
- c++ - 来自字符串数组的 C++ 指针数组
- python - Django 如何添加对富编辑器的回复