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

时间:2018-06-12 01:00:23

标签: android rx-java2

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

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

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

第7行andThen的文档说:

  

返回一个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 }

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

1 个答案:

答案 0 :(得分:5)

如果您完全避免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完成之前发生,因此somethingId的值仍然是一个空字符串。