android - 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 (有效)。但是,我随后更改了该方法的签名,以便可以在这种感觉不对的特定方法中使用它。当然有一种方法可以在不这样做的情况下让它工作吗?
解决方案
如果您完全避免该操作,您可以在不更改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
仍然是一个空字符串。
推荐阅读
- react-native - [未处理的承诺拒绝:错误:预期的 URL 方案“http”或“https”但是“文件”]
- python - 将 Python .exe 文件发送到没有 Python 的机器
- php - 如何在php中的数组中设置逗号?
- react-native - 当模态在本机中打开时,我如何单击模态后面的组件
- visual-studio-2015 - SSIS 约束
- autodesk-forge - 在伪造查看器上加载和运行扩展
- ruby-on-rails - Rails ActiveRecord - 字段验证
- vuejs2 - 如何制作未知的vue-model数组?
- java - JUnit 方法的执行顺序混乱
- spring - spring feign客户端的分页和标准