Возврат из наблюдаемого вызова против ненаблюдаемого с использованием Rx Java (Android / Kotlin) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть функция, которая принимает логическое входное значение, и в зависимости от этого она должна подписаться на Observable в одном случае и немедленно вернуться в другом случае. Вот как это выглядит:

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

Приведенный выше метод reauthenticate() возвращает Observable, и его необходимо вызывать и возвращать только после завершения. В противном случае он может немедленно вернуть значение, полученное из createMap().

. Две очевидные проблемы заключаются в том, что я получаю «возврат не разрешен здесь» для первого оператора возврата, и я получаю ошибку, потому что Я не возвращаю ничего за пределами оператора if.

Есть ли другой способ, которым это может быть по-разному написано для правильной работы? Я попробовал некоторые предложения, которые я нашел (например, назвав лямбду, встроенную функцию), но, похоже, ничего не работает, и я, вероятно, упускаю что-то очевидное, предполагая, что это возможно.

Редактировать: Этот метод является метод обратного вызова в интерфейсе, который запускается из стороннего SDK, поэтому у меня нет гибкости относительно фактического ввода или вывода метода.

1 Ответ

1 голос
/ 21 апреля 2020

Если 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()
}
...