当前位置: 首页 > 知识库问答 >
问题:

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

范振海
2023-03-14

我正在使用静态编程语言反应器(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个答案

方寒
2023-03-14

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

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

 类似资料:
  • 问题内容: 我有以下功能 这段代码: 我的问题可能有点难以理解,所以请忍受:是什么使该代码段与常规调用完全区分开,或者是什么使该代码段需要引用函数变量而不是常规调用?() 我怎么知道应该在哪里引用该函数,以及什么时候该真正调用它? 问题答案: 好吧,该属性期望对函数的引用,以便在单击元素时执行该函数。通常是: 要么 (但是,当然,最好使用和) 请注意,它们都是如何引用函数而不是调用。 当某些东西需

  • 我一直在使用ECMAScript 很明显第一步是ECMAScript 下面是我如何实现基本promise的示例/伪代码- 随着时间的推移,我遇到了ECMAScript 同样,这里有一个伪代码,描述了我的异步等待函数的样子- 把语法错误(如果有的话)放在一边,我觉得它们做的事情完全一样。我几乎可以用async、Waities取代我的大部分promise。 当promise做类似的工作时,为什么需要异

  • 问题内容: 我一直在阅读iBooks中的快速编程指南。有人可以向我解释函数和闭包之间的区别是什么。只是它没有名称并且可以在表达式中使用? 问题答案: 函数实际上只是命名为闭包。以下至少在概念上是等效的: 在使用声明方法的情况下,这变得有些复杂,例如,关于自动插入公共命名参数等,添加了一些有趣的糖,例如,变为`func myMethod(foo:Int, #bar:Int, 但是,即使方法只是闭包的

  • 问题内容: OpenAI的强化学习的REINFORCE和actor-critic示例具有以下代码: 加强: 演员评论家: 一种正在使用,另一种正在使用。 据我所知,文档没有对它们之间进行任何明确的区分。 我很高兴知道这些功能之间的区别。 问题答案: 沿着 新的维度 连接张量序列。 在给 定维度上 连接给定序列张量的序列。 因此,如果和具有形状(3,4),则将具有形状(6,4),并将具有形状(2,3

  • 问题内容: 之间有什么区别: 和 和 问题答案: 注意事项 : 这个答案仅涵盖了系列和系列之间的时序差异。。 为了这个答案的目的,我将使用一些示例方法: 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后被拒绝。 调用将启动计时器。在所有延迟完成后,可以使用等待一些延迟来解决,但请记住它们是同时执行的: 例子

  • 问题内容: 之间有什么区别: 和 和 问题答案: 注意事项: 这个答案仅涵盖了await系列和系列之间的时序差异Promise.all。请务必阅读@mikep的综合答案,其中也涵盖了错误处理方面更重要的区别。 出于此答案的目的,我将使用一些示例方法: res(ms) 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 rej(ms) 是一个函数,它需要一个整数毫秒,并返回一个