首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxJava:如何在每次可观察到的父级发射时先于startWith()默认发出?

RxJava:如何在每次可观察到的父级发射时先于startWith()默认发出?
EN

Stack Overflow用户
提问于 2017-10-06 21:47:51
回答 2查看 2.6K关注 0票数 2

我试图有一种模式,在这种模式中,我的可观察对象产生一些对象,被转化为域事件,比如开始、成功、在可观察的生产过程中发出的错误,如果这是有意义的话。

代码语言:javascript
运行
复制
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就可以做出相应的反应(在映射中可以看到包含extractedEpub对象的成功)。

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

使事件的流程开始,成功,Succes .成功.

我要它开始,成功,开始,成功。等,即预先启动的事件,谁combineLatest发出,但我的rx知识是不够的。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-10-06 22:05:29

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

代码语言:javascript
运行
复制
.flatMap( event -> Observable.just( new BookRenderingEvent.Started(), event )

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-10-07 15:14:12

好吧,我已经想清楚了。我所缺少的关键信息是,当左侧发射时,平面地图的右侧就会被订阅。因此,startWith必须移动到可观察到的平面地图的右侧,当combineLatest发出时,就会得到订阅。

代码语言:javascript
运行
复制
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()));
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46614380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档