我正在使用静态编程语言反应器(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不显示?
谢谢
当您在反应链上调用subscribe
时,您将其与主流分离,它将变得独立且可能异步。错误作为信号在反应流上传播,而不是作为传统的抛出异常。在这种情况下,使用诸如doError
、OneErrorMap
、OneErrorReturn
等操作符的反应链负责错误处理。
另一方面,Kotlin的await
打破了这种独立性,将反应流附加回主流,并允许您编写必要的反应/异步代码(例如:try-catch块、展开的函数返回类型等)。