Получить результат метода подписки Flowable

Я использую Flowable data в своем методе и подписываюсь на него, чтобы получить результат. Мне нужно получить результат от метода подписки таким образом, чтобы я мог убедиться, что следующая инструкция в моем коде будет выполнена немедленно.

В своем коде я помещаю следующую инструкцию сразу после метода подписки. Хотя я думаю, что он не будет работать синхронно.

override fun authenticate(route: Route?, response: Response): Request? {
    var userForSave: User? = null
    if (responseCount(response) >= 2) {
        return null
    }
    userDao.getAll().map({ items -> items.first({ it.userName == user!!.userName} )})
        .subscribe({ res -> userForSave = res })
// I need to make sure that the next instruction after subscribe is this
    val tokenDto: TokenDto = TokenDto(token = userForSave!!.token, refreshToken = userForSave!!.refreshToken)
    val refreshTokenCall = service.refreshToken(tokenDto)
    val refreshResponse = refreshTokenCall.execute()
    if (refreshResponse.isSuccessful) {
        userForSave!!.token = refreshResponse!!.body()!!.token
        userForSave!!.refreshToken = refreshResponse!!.body()!!.refreshToken
        userDao.update(userForSave!!)
        return response.request()
            .newBuilder()
            .header("Authorization", "Bearer ${userForSave!!.token}")
            .build()
    }
    return null
}

Мне нужно убедиться, что я могу использовать «userForSave» для следующей инструкции.

1
0
227
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам нужно получить первую эмиссию Flowable синхронно, вы можете вызвать blockingFirst() вместо subscribe(Consumer). В вашем случае это должно выглядеть так:

userForSave = userDao
        .getAll()
        .map({ items -> items.first({ it.userName == user!!.userName} )})
        .blockingFirst()

Предположим, результат, который будет сохранен в userForSave, получен через 4 секунды. Что произойдет, если вы попытаетесь напечатать его точно после этой строки?

Mahdi-Malv 18.02.2019 23:37

Я не уверен, что понял вопрос. blockingFirst заблокирует выполнение в потоке, из которого вы делаете вызов, если вы напечатаете значение userForSave сразу после вызова blockingFirst, вы увидите значение, возвращаемое из Flowable. Вы увидите значение через 4 секунды.

lelloman 19.02.2019 00:35

Другие вопросы по теме