等待函数(协程)和Reactor订阅之间有什么区别

时间:2020-03-03 14:32:16

标签: kotlin project-reactor kotlin-coroutines

我正在使用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没有显示?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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