【问题标题】:Returning from Observable call vs non-Observable using RxJava (Android/Kotlin)使用 RxJava (Android/Kotlin) 从 Observable 调用与非 Observable 返回
【发布时间】:2020-04-21 06:48:08
【问题描述】:

我有一个接受布尔输入值的函数,根据它,它需要在一种情况下订阅 Observable 并在另一种情况下立即返回。这是它的样子:

fun getMap(needsReauth: Boolean): Map<String, Any>? {
    if (needsReauth) {
        AuthManager.reauthenticate().subscribe {
            return createMap()
        }
    } else {
        return createMap()
    }
}

上面的reauthenticate()方法返回一个Observable,需要调用,完成后才返回。否则它可以立即返回它从createMap() 获得的值。

两个明显的问题是,我在第一个 return 语句中得到“此处不允许返回”,并且我得到一个错误,因为我没有返回 if 语句之外的任何内容。

是否有不同的方式可以以不同的方式编码以正常工作?我尝试了一些我发现的建议(即命名 lambda,内联函数),但似乎没有任何效果,而且我可能会遗漏一些明显的东西,假设这是可能的。

编辑:此方法是接口中的回调方法,由第 3 方 SDK 触发,因此我对实际方法输入或输出没有灵活性。

【问题讨论】:

  • 您可以尝试的一件事是不返回,而是创建一个方法并在获取地图值后执行您想要执行的代码块。
  • 感谢您的快速回复。你介意扩展一下吗?不幸的是,我确实需要从此方法返回,因为它是供应商产品在我们需要重新认证时需要的回调,并且该方法是这样定义的。
  • 您能告诉我您使用的是架构 mvp 还是 mvvm 中的任何一种。
  • 该应用主要使用MVVM
  • 所以我猜这个逻辑会在视图模型中,所以你需要在视图或视图模型中使用这个值,如果你需要在视图中直接更新而不是返回,或者如果您在视图模型本身中需要它,则使用此映射值作为参数对后续方法进行并行调用。

标签: android kotlin lambda rx-java


【解决方案1】:

如果AuthManager.reauthenticate()返回一个Observable并且你不能重构getMap(...)的调用者来接受一个异步结果,你应该能够调用io.reactivex.Observable.blockingFirst(),阻塞调用线程直到值可用:

fun getMap(needsReauth: Boolean): Map<String, Any>? {
    if (refreshContext) {
        AuthManager.reauthenticate().blockingFirst() // presumably validate the result?
    }

    return createMap()
}

【讨论】:

  • 谢谢!这行得通。作为参考,如果有人使用没有blockingFirst()的Rx版本,语法也可以是:toBlocking().first()
  • 那可能是blockingGet()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多