【问题标题】:Improve chaining multiple (three) Completables by using RxJava使用 RxJava 改进链接多个(三个)Completables
【发布时间】:2022-01-23 12:37:51
【问题描述】:

我想一个接一个地调用 Completable。也就是说,当第一个完成时,调用第二个,当第二个完成时,调用第三个。我已经尝试过一些不同的东西,比如 andThen(),但发现它不会“等待”之前的 Completable 完成,因为它是并行运行的。到目前为止,这就是我所发现的,它可以按我的意愿工作,但是有没有更好的方法来改进它。有没有什么操作函数或者什么东西可以在每个阶段去掉Completable.defer?

这是迄今为止的工作示例:

   private fun invokeAllThreeDoSomeLogic() {
        
        disposable.add(Completable.concatArray(
                Completable.defer {
                    firstApi.getData().doOnError { t: Throwable? ->
                        Timber.w(
                            t,
                            "first error"
                        )
                    }
                },
                Completable.defer {
                    Completable.fromObservable(secondApi.getData()
                        .doOnError { t: Throwable? ->
                            Timber.i(
                                t,
                                "Second error"
                            )
                        }
                },
                Completable.defer {
                    thirdApi.refresh().doOnError { t: Throwable? ->
                        Timber.i(
                            t,
                            "Third error"
                        )
                    }
                }
            ).subscribe(
                { },
                { t: Throwable? ->
                    Timber.w(t, "something went wrong")
                })
        )
    }


【问题讨论】:

    标签: android rx-java rx-kotlin


    【解决方案1】:

    使用 FlatMap 进行链式 api 调用。会是这样的

    firstApi.getData()
       .flatmap(dataFromApi1 -> return secondApi.getData())
       ......
       ......
    

    查看thismedium blog 以获得更好的理解。

    编辑:

    对于 Completable,您可以使用 andThen 运算符。

    firstCompletable
        .andThen(secondCompletable)
    

    请查看this answer

    从那个答案:

    一般来说,这个操作符是一个 flatMap 的“替代品” 可完成:

    【讨论】:

    • 好主意,但我试过了。问题是我不能在 Completable 上调用 flatMap,因为 firstApi.getData 返回 Completable()。还是我错了?
    • 你不需要Completable,你可以使用Single作为它的api。检查博客链接
    • 你是对的,但应该返回什么类型不是我的决定。
    • 更新了我对Completable的回答,请检查
    • 是的,正如我在问题文本中所说,确实尝试了 andThen(sec).andThen(third) 但它不是从 first-> sec ->third...它并行运行。完成后一个接一个地运行很重要。
    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多