【问题标题】:Get result of the subscribe method of Flowable获取 Flowable 订阅方法的结果
【发布时间】:2019-02-18 11:00:20
【问题描述】:

我在我的方法中使用 Flowable 数据并订阅它以获得结果。我需要以一种可以确保代码中的下一条指令立即运行的方式从 subscribe 方法获取结果。

在我的代码中,我将下一条指令放在订阅方法之后。虽然我认为它不会同步运行。

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”。

【问题讨论】:

    标签: android kotlin rx-java2


    【解决方案1】:

    如果您需要同步获取Flowable的第一个发射,您可以调用blockingFirst()而不是subscribe(Consumer)。在您的情况下,它应该如下所示:

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

    【讨论】:

    • 假设 4 秒后收到将保存在userForSave 中的结果。如果您尝试在该行之后打印它会发生什么?
    • 我不确定我是否理解了这个问题。 blockingFirst 将阻止您调用的线程中的执行,如果您在调用blockingFirst 之后立即打印userForSave 的值,您将看到从Flowable 返回的值。不过,您将在 4 秒后看到该值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2021-06-14
    • 2019-06-26
    • 2018-03-01
    相关资源
    最近更新 更多