订阅时以相反顺序重播缓存的项目

时间:2018-10-19 21:41:09

标签: rxjs rx-java system.reactive monix

我有一个ConnectableObservable,订阅该对象后,它将按其原始顺序(从最旧到最新)重播最后x个项目,并在其后回放任何后续事件。

我正在使用此Observable作为事件吸墨纸的后备存储,但是在订阅时,我实际上希望以相反的顺序(从最新到最旧)推送/打开下一个重放的项目,因此我可以显示最相关的首先。

使用标准的RX运算符可以实现吗?还是我必须创建一个自定义的运算符?

1 个答案:

答案 0 :(得分:0)

您无法使用replay()来完成此操作,因为您只需要在未终止的源上获取缓存的项目即可。但是,ReplaySubject可以让您窥视它并获取可以反转的项数组,然后与同一主题中的其余项并置,但跳过刚刚检索的快照项:

ReplaySubject<ItemType> subject = ReplaySubject.create();

source.subscribe(subject);

Observable<ItemType> result = Observable.defer(() -> {
    ItemType[] current = subject.getValues(new ItemType[0]);

    return Observable.range(0, current.length)
        .map(index -> current[current.length - 1 - index])
        .concatWith(subject.skip(current.length));
});