【发布时间】:2018-06-12 17:12:52
【问题描述】:
在下面的方法中,如何将第一个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 }
此时我唯一能想到的就是为第 6 行的 saveSomething() 方法返回一个 Single(有效)。但是,我随后更改了该方法的签名,以便我可以在这种感觉不对的特定方法中使用它。当然有一种方法可以在不这样做的情况下让它工作吗?
【问题讨论】:
-
saveSomething必须是可完成的吗?如果没有,你可以写remoteDataSource.downloadSomething().doOnComplete { saveSomething(it)}.map(it.id) -
是的,因为调用函数必须等待它完成才能继续(它会尝试使用 id 在本地获取下载的东西)。