提问者:小点点

等待函数(coroutine)和订阅函数之间的区别是什么


我正在使用静态编程语言反应器(Mono和Flux),我想知道使用wait...()(来自kotlin-coroutines-reactive)函数和订阅()(来自React)之间的区别。我带来了两个例子来展示我正在努力做的事情。

示例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个答案

匿名用户

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

另一方面,Kotlin的await打破了这种独立性,将反应流附加回主流,并允许您编写必要的反应/异步代码(例如:try-catch块、展开的函数返回类型等)。