从多个源获取最后发出的对象

时间:2017-12-07 20:22:48

标签: rxjs

更具体地说,我不想要一组发射物体。我想要任何一个源发出的最后一个对象。

目前,它的工作方式如下

.withLatestFrom(subject1, subject2)
.switchMap([val1, val2]) => {...}

我想要的是

.withLatestFrom(subject1, subject2)
.switchMap(latestVal) => {...}

避免可能的x = y问题。我有两个科目。 Subject1和Subject2。

如果subject2已发出任何值,则该值将始终胜过subject1。在我的用例中,一旦主题2开始发出,该特定模块将忽略主题1.但主题1将在其他地方使用。

但是我想要一种方法来将这两个主题作为源提供,并获得最后一个发射值,或者如果主题2不是空,则获得主题2的最后一个值。如果主题2为null,则从主题1获取最后一个值。

1 个答案:

答案 0 :(得分:1)

以下是我认为您正在寻找的例子:

const first = Rx.Observable.interval(1000).map(x => `first (${x})`);
const second = Rx.Observable.interval(2000).map(x => `second (${x})`);

Rx.Observable.merge(
  first.takeUntil(second),
  second
)
.subscribe(
  x => { console.log('next: ', x); },
  null,
  () => { console.log('complete'); }
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.5/Rx.min.js"></script>

takeUntil将导致“first”observable在第一次“第二次”observable发出时停止为此订阅发出值。