RxJava Single到Completable to Single-如何将第一个Single的结果传递给第二个Single

Mic*_*ovo 1 android rx-java2

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

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

有趣的是,如果我在方法中断点,它会在第5行和第6行之前停在第7行。

andThen在线7 的文档说:

返回一个Single,它将订阅此Completable,完成后将订阅{@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 }
Run Code Online (Sandbox Code Playgroud)

在这一点上,我唯一想做的就是为第saveSomething()6行的方法返回Single (有效)。但是,我只是更改了该方法的签名,以便可以在感觉不正确的特定方法中使用它。当然,有一种方法可以不执行此操作?

Jos*_*ozo 6

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 }
Run Code Online (Sandbox Code Playgroud)

要么:

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 }
Run Code Online (Sandbox Code Playgroud)

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