RxJS:我如何订阅仅在订阅之后发出的Observable数据?

时间:2016-08-14 07:34:21

标签: reactive-programming rxjs rxjs5

上下文:我有很多ConnectableObservable个,几乎所有的重播次数都是1或更多。在任何特定时间,观察者都有许多观察者订阅和取消订阅。

我想要的是什么:在很多情况下,当观察者订阅其中一个观察者时,我并不关心由于可观察性而可能存在的预先存在的发射数据数据重播机制。最近订阅的观察者感兴趣的唯一数据是在订阅之后发出的数据。

const observable = Rx.Observable
    .interval(100)
    .take(4)
    .publishReplay(3);

observable.connect();

问题:据我所知,当一个观察者订阅了observable时,它无法知道它所观察到的数据是在订阅之前还是之后发出的。

observable.subscribe(x => console.log('observed', x));

setTimeout(() => 
    observable.subscribe(y => console.log('delayed observed', y)), 
    400
);

上面的代码将输出:

// => observed 0
// => observed 1
// => observed 2
// => delayed observed 0 **don't care**
// => delayed observed 1 **don't care**
// => delayed observed 2 **don't care**
// => observed 3
// => delayed observed 3

在这种假设情况下,延迟观察者只对订阅后的数据感兴趣;在这种情况下,3

我已经搜索了RxJS 5 reference docs并且似​​乎无法找到一个银弹操作员来完成我所追求的目标。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用.skipUntil(Rx.Observable.timer(0)),因为重播的元素将同步重播,skipUntil将使Observable的其余部分脱离同步执行,正好在它接收到的时刻重播价值。

此代码将生成您想要的结果:

const observable = Rx.Observable
    .interval(100)
    .take(4)
    .publishReplay(3);

observable.subscribe(x => console.log('observed', x));

setTimeout(() => 
    observable
        .skipUntil(Rx.Observable.timer(0))
        .subscribe(y => console.log('delayed observed', y)), 
    400
);

observable.connect();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>

答案 1 :(得分:0)

你可以这样做吗?

const observableNoReplay = Rx.Observable
    .interval(100)
    .take(4);

const observable = observableNoReplay
    .publishReplay(3);

observable.connect();

您可以订阅当时您需要的任何可观察物,而不必担心任何类型的银弹。