我正在使用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没有显示?
谢谢。
答案 0 :(得分:1)
当您在反应式链上调用subscribe
时,会将其与主流分离,它就变得独立且可能是异步的。错误是作为信号而不是传统上抛出的异常在响应流上传播的。在这种情况下,错误处理是使用诸如doOnError
,onErrorMap
,onErrorReturn
等操作符的响应链的责任。
另一方面,Kotlin的await
打破了这种独立性,并将反应式流附加到主流上,并让您编写反应式/异步代码,因为这势在必行(例如:try-catch块,未包装的函数返回)类型等)。