RxJava/Kotlin Observable 方法调用链 - 如何终止?

Posted

技术标签:

【中文标题】RxJava/Kotlin Observable 方法调用链 - 如何终止?【英文标题】:RxJava/Kotlin Observable method call chain - how to terminate? 【发布时间】:2019-05-10 02:13:45 【问题描述】:

我想实现编辑笔记的方法,将其保存到本地数据库(缓存),然后将其作为 POST 请求发送到服务器。我正在学习 RxJava,我想从注释中创建 Observable,然后对其应用转换,例如将其映射到实体模型并保存。我的方法返回 Completable 并且此链返回 Observable<Completable> 的问题。如何从这个 Observable 中解开 Completable,我只是用来启动 RxJava 的东西。每个editNote() 方法都返回一个Completable

 override fun editNote(note: Note): Completable 
    return Observable.just(note)
        .map  mapper.mapToEntity(it) 
        .map  noteEntity ->
            factory.getCacheDataStore().editNote(noteEntity)
                .andThen  factory.getRemoteDataStore().editNote(noteEntity) 
        

================================================ ========

更新

最后,我设法找到了“解决方案”,但我不确定它是否正确 :-)

override fun editNote(note: Note): Completable 
    return Observable.just(note)
        .map  mapper.mapToEntity(it) 
        .flatMapCompletable  noteEntity ->
            factory.getCacheDataStore().editNote(noteEntity)
                .andThen  factory.getRemoteDataStore().editNote(noteEntity) 
        

【问题讨论】:

【参考方案1】:

您正在寻找flatMapCompletable 而不是map,因为map 只是截取流并将排放映射到另一种类型,而来自文档的“flatMap”(或它的兄弟姐妹):

将 Observable 发射的项目转换为 Observable,然后将这些项目的发射扁平化为单个 Observable。

你可以在Here看到它的弹珠图

【讨论】:

你能把那个(地图和平面地图的区别)翻译成英文吗? Rx 文档是用他们自己的语言编写的,而且非常不透明。 ***.com/questions/22847105/… 也许每个用例会帮助您了解差异。

以上是关于RxJava/Kotlin Observable 方法调用链 - 如何终止?的主要内容,如果未能解决你的问题,请参考以下文章

RXJava/Kotlin - 链接单个结果为一个

链接多个调用 RxJava、Room 和 Retrofit

Android 中使用 ThreadPoolExecutor

Android 中使用 ThreadPoolExecutor

Android 中使用 ThreadPoolExecutor

Observable<Observable<T>> 到 Observable<T> rxswift