我试图有一种模式,在这种模式中,我的可观察对象产生一些对象,被转化为域事件,比如开始、成功、在可观察的生产过程中发出的错误,如果这是有意义的话。
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知识是不够的。
谢谢
发布于 2017-10-06 22:05:29
您可以在正确的位置将以下内容插入到可观察的链中:
.flatMap( event -> Observable.just( new BookRenderingEvent.Started(), event )这将在它接收到的每个事件之前发出Started事件。
当然,您可以添加一些逻辑,这样如果事件是Started,就不会发出Started,等等。
发布于 2017-10-07 15:14:12
好吧,我已经想清楚了。我所缺少的关键信息是,当左侧发射时,平面地图的右侧就会被订阅。因此,startWith必须移动到可观察到的平面地图的右侧,当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()));
}https://stackoverflow.com/questions/46614380
复制相似问题