使用RxJava从可观察的调用返回与不可观察的返回(Android / Kotlin)

时间:2020-04-21 06:48:08

标签: android kotlin lambda rx-java

我有一个接受布尔输入值的函数,并且依赖于此,它需要在一种情况下订阅一个Observable并在另一种情况下立即返回。看起来像这样:

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

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

两个明显的问题是,我在第一个return语句中获得了“此处不允许返回”,并且由于没有在if语句之外未返回任何内容而出现了错误。

是否可以通过其他方式对此编码进行不同的编码以使其正常工作?我尝试了一些发现的建议(即,命名为lambda,内联函数),但似乎没有任何效果,并且在可能的情况下,我很可能会遗漏一些明显的东西。

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

1 个答案:

答案 0 :(得分: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()
}