首页 > 解决方案 > 为什么我的 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

为什么?

标签: javascriptrxjsrxjs5

解决方案


这些可观察的都没有任何延迟。一旦您订阅,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

推荐阅读