首页 > 解决方案 > RxJava Single to Completable to Single - 如何将第一个Single的结果传递给第二个Single

问题描述

在下面的方法中,如何将第一个 Single 的结果传递给第二个 Single?

正如它现在所写的,当它返回时,它somethingId是空的。如果我将返回的值更改为Single.just(somethingId)空字符串以外的值,它将返回该值。

有趣的是,如果我在方法中设置断点,它会在第 7 行停止,然后再转到第 5 行和第 6 行。

第 7 行的文档andThen说:

返回一个将订阅此 Completable 的 Single,一旦完成,将订阅 {@code next} SingleSource。

为什么它似乎按该顺序执行和/或有更好的方法来执行此操作?

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }

此时我唯一能想到的就是为第saveSomething()6 行的方法返回一个 Single (有效)。但是,我随后更改了该方法的签名,以便可以在这种感觉不对的特定方法中使用它。当然有一种方法可以在不这样做的情况下让它工作吗?

标签: androidrx-java2

解决方案


如果您完全避免该操作,您可以在不更改saveSomething方法签名的情况下获得相同的结果:flatMapCompletable

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4            saveSomething(something).andThen(Single.just(something.id))
5        }
6 }

或者:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4           saveSomething(something).toSingleDefault(something.id)
5        }
6 }

您目前遇到的问题Single.just(somethingId)是作为 RxJava 管道创建的一部分执行,因此它发生在 downloadSomething 完成之前,因此 valuesomethingId仍然是一个空字符串。


推荐阅读