【问题标题】:RxJava Single to Completable to Single - how to pass the result of the first Single to the second SingleRxJava Single to Completable to Single - 如何将第一个Single的结果传递给第二个Single
【发布时间】: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 在本地获取下载的东西)。

标签: android rx-java2


【解决方案1】:

如果您完全避免 flatMapCompletable 操作,您可以在不更改 saveSomething 方法签名的情况下获得相同的结果:

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 的值仍然是一个空字符串。

【讨论】:

  • 哇,谢谢!很好的答案。我还在学习编写 RxJava 的方法,你给了我更多的想法并解释了哪里出了问题。
  • 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多