在以下方法中,如何将第一个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(可行)。然而,我正在改变该方法的签名,所以我可以在这种感觉不正确的特定方法中使用它。当然有一种方法可以让它在没有这样做的情况下工作吗?
答案 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
的值仍然是一个空字符串。