【问题标题】:RxJava: How to prepend startWith() default emit EVERY TIME parent observable emits?RxJava:如何预先添加 startWith() 默认发射每次父可观察发射?
【发布时间】:2017-10-06 21:47:51
【问题描述】:

我试图有一个模式,其中我的 observable 产生一些对象,被转换为域事件,如 Started、Success、Error 在 observable 产生周围发出,如果这有意义的话

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) {
        return extractObservable(epubPath)
                .flatMapObservable(extractedEpub -> renderObservable(extractedEpub)
                        .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub))
                        .onErrorReturn(t -> new BookRenderingEvent.Error())
                        .startWith(new BookRenderingEvent.Started()));
    }

private Observable<RenderedEpub> renderObservable(ExtractedEpub extractedEpub) {
        return Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..)
                    .switchMapSingle(foo -> doRenderObservable()) <--- heavy work
                    .map(bar -> new RenderedEpub(bar))
}

renderObservable 包含一个繁重的操作,所以我想发出这些状态事件,以便 UI 可以做出相应的反应(成功包含提取的 Epub 对象,如您在地图中看到的)

我的问题是,renderObservable 包含 combineLatest(),因此它“保持打开状态”并在其 obervable 发出时及时发出多次。

所以事件流程是 Started, Success, Succes ... Success。

我希望它是 Started、Success、Started、Success .. 等。 即在 combineLatest 发出时预先添加 Started 事件,但我的 rx 知识不足。 p>

谢谢

【问题讨论】:

    标签: java android rx-java reactive-programming rx-java2


    【解决方案1】:

    您可以将以下内容插入到可观察链中的正确位置:

    .flatMap( event -> Observable.just( new BookRenderingEvent.Started(), event )
    

    这将在它接收到的每个事件之前发出Started 事件。

    当然,你可以添加一些逻辑,这样如果事件是Started等,你就不会发出Started

    【讨论】:

    • 请把它放在哪里?我没有想法.. 猜测它需要在 combineLatest 之后触发,以便在每次发射时触发,但是我将如何运行 doRenderObservable?
    • 就在您当前拥有startWith()的位置
    • 这将使成功先于开始
    • 没有。 Observable.just( Started, event) 发出 Started 后跟事件。
    • 哦,我没有注意到最后的事件
    【解决方案2】:

    好的,我已经设法弄清楚了。我缺少的关键信息是,当左侧发射时,平面图的右侧会被订阅。因此 startWith 必须移动到 flatmap observable 的右侧,当 combineLatest 发出时就会被订阅

    public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) {
            return extractObservable(epubPath)
                    .flatMap(extractedEpub -> Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..)
                            .switchMap(foo -> renderObservable(extractedEpub)
                                .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub))
                                .onErrorReturn(t -> new BookRenderingEvent.Error())
                                .startWith(new BookRenderingEvent.Started()));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多