【问题标题】:What is the difference between await functions (coroutine) and subscribe on Reactor等待函数(协程)和订阅 Reactor 有什么区别
【发布时间】:2020-03-03 14:32:16
【问题描述】:

我正在使用 Kotlin + Reactor(Mono 和 Flux),我想知道使用 await...()(来自 kotlin-coroutines-reactive)函数和 subscribe()(来自 Reactor)之间的区别。我举了两个例子来说明我想要做什么。

示例 1(带等待功能):

@Test
internal fun test() = runBlockingTest {
    Mono.error<String>(IllegalStateException("exception"))
        .doOnError {
            print("error")
        }.awaitFirst().let {
            print("success")
        }
}

输出:“错误”带有 IllegalStateException 堆栈跟踪

示例 2(带订阅功能):

@Test
internal fun test() = runBlockingTest {
    Mono.error<String>(IllegalStateException("exception"))
        .doOnError {
            print("error")
        }.subscribe {
            print("success")
        }
}

输出: 只是“错误”。

为什么示例 1 显示堆栈跟踪而示例 2 不显示?

谢谢。

【问题讨论】:

  • 在第一个示例中,您使用awaitFirst 明确要求第一个值并获得异常作为答案。在第二个示例中,您不请求任何内容,只需订阅并提供在每个收到的项目上运行的回调。

标签: kotlin project-reactor kotlin-coroutines


【解决方案1】:

当您在反应链上调用 subscribe 时,您将其与主流解耦,它变得独立并且可能是异步的。错误作为信号而不是传统上抛出的异常在反应流上传播。在这种情况下,错误处理是使用 doOnErroronErrorMaponErrorReturn 等运算符的反应链的责任。

另一方面,Kotlin 的 await 打破了这种独立性,将响应式流附加回主流,并让您编写响应式/异步代码,因为它是必要的(例如:try-catch 块、未包装的函数返回类型、等等)。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2021-02-14
    • 1970-01-01
    • 2015-02-24
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多