首页 文章

RxJava 2 - Observable.flatMapSingle澄清

提问于
浏览
3

我做了一个包含以下步骤的 RxJava2 实验:

  • ListA 对象创建一个Observable .

  • 使用flatMapSingle()将Observable发出的每个项目映射到SingleSource . 在flatMapSingle(), an asychronous operation is executed for each item emitted by the Observable 内 .

  • 收集 ListB 中的所有项目,Observable.toList()

结果:由于异步操作, ListB 的项目与 ListA 的顺序不同 .

因此,似乎flatMapSingle()的工作方式与flatMap()类似,它使用合并运算符并不保证元素的顺序将被保留 .

我的结论是否正确?文档没有涵盖我,并且不存在关于此行为的讨论 .

1 回答

  • 4

    flatMap 不保证在评论中提到的@akarnokd订购 .

    如果您想保证订购,可以使用 concatMap ,但它允许您只与内部 Observable 连接 . 似乎在RxJava1和RxJava2中都没有 concatMapSingle 的版本 . 但是,您可以通过自己使用 toObservable() 将内部 Single 转换为 Observable 并将其与 concatMap 一起使用(使用Kotlin编写的代码)来解决此问题 .

    Observable
        .fromIterable(listA)
        .concatMap { single.toObservable() }
        .toList() // Items in the list has same order of listA
    

    请注意,还有 concatMapEager 将热切地订阅内部 Observable (或上例中的 Single ),这可能有助于改进并行化任务 .

相关问题