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

项目Reactor:onErrorResume后平面图

司空赞
2023-03-14
Flux.just("a", "b")
        .flatMap(s -> s.equals("a") ? Mono.error(new RuntimeException() : Flux.just(s + "1", s + "2"))
        .onErrorResume(throwable -> Mono.empty())
        .subscribe(System.out::println);

你好

在这里,我做了两个元素的通量,然后通过平面图公开第一个异常,第二个通量。

使用onErrorResume,我希望输出

b1
b2

但什么也得不到。谁能解释一下为什么会这样?

谢谢

共有2个答案

杜河
2023-03-14

这个问题已经有了一个可靠的答案,即为什么会发生这种情况。要回答一个有点离题的问题,即如何实现预期输出:

必须将onErrorResume调用移到平面图中:

Flux.just("a", "b")
    .flatMap(s ->
        (s.equals("a") ? Mono.error<RuntimeException>(RuntimeException()) : Flux.just(s + "1", s + "2"))
             .onErrorResume(ex -> Mono.empty())
    )
    .subscribe(System.out::println)

这样输出和预期的一样

b1
b2
闻人花蜂
2023-03-14

鉴于此:

Flux.just("a", "b", "c")
        .flatMap { s ->
            if (s == "b") 
                Mono.error<RuntimeException>(RuntimeException()) 
            else 
                Flux.just(s + "1", s + "2")
        }.onErrorResume { throwable -> Mono.just("d") }.log()
        .subscribe { println(it) }

输出为:

12:35:19.673 [main] INFO reactor.Flux.OnErrorResume.1 - onSubscribe(FluxOnErrorResume.ResumeSubscriber)
12:35:19.676 [main] INFO reactor.Flux.OnErrorResume.1 - request(unbounded)
12:35:19.677 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(a1)
a1
12:35:19.677 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(a2)
a2
12:35:19.712 [main] INFO reactor.Flux.OnErrorResume.1 - onNext(d)
d
12:35:19.713 [main] INFO reactor.Flux.OnErrorResume.1 - onComplete()

这是怎么回事?onErrorResume()正在应用于平面地图()运算符返回的发布服务器。由于在“b”上发布服务器发出失败信号,因此平面地图()发布服务器不再执行并且onErrorResume()运算符继续使用其回退发布。

onErrorResume()的文档清楚地表明,原始发布服务器由于错误而完成,并且回退接管:

 类似资料:
  • Floorplan 是 Home Assistant 最受瞩目的衍生项目之一。其作用是衔接房屋平面图与Home Assistant 智能家居,打造活点地图般的控制界面。

  • 问题内容: 因此,我尝试创建一个水平列表以在我正在设计的新网站上使用。我已经尝试了许多在网上找到的建议,例如将“ float”设置为左等,但在解决问题时,这些建议均无效。 目前,我不确定导致此问题的原因是什么,该如何解决? 问题答案: 我注意到很多人都在使用此答案,因此我决定对其进行一些更新。如果您想查看原始答案,请检查以下内容。新答案演示了如何将某些样式添加到列表中。

  • 我从留档中读到: 将该流量发出的元素异步转换为发布者,然后通过合并将这些内部发布者平坦化为单个流量,从而允许它们交错。 那个: 将此流量发出的元素异步转换为发布者,然后将这些内部发布者平坦化为单个流量,但按其源元素的顺序合并它们。 并且: 将此流量发出的元素异步转换为发布者,然后将这些内部发布者展平为单个流量,顺序并使用串联保持顺序。该运算符有三个维度可以与flatMap和flatMapSeque

  • 通量上的平面图总是连续的吗?我知道在flatMap返回通量中使用then函数时不是顺序的。项目Reactor平面图 但是如果flatMap中使用的函数返回mono,它是否总是顺序的? 假设我有一个函数,它接受一个对象,只返回Mono。 然后呢 总是返回2,3,4,5?

  • 有没有可能删除一个谷歌云平台项目,在删除完成后,用相同的ID制作另一个GCP项目?

  • 本文向大家介绍Android平滑的加载项目,包括了Android平滑的加载项目的使用技巧和注意事项,需要的朋友参考一下 示例 如果您RecyclerView从网络中加载数据中的项目(通常是图像)或执行其他处理,这可能会花费大量时间,并且最终可能会在屏幕上显示项目,但未完全加载。为避免这种情况,您可以扩展现有LinearLayoutManager项以在屏幕上可见之前预加载许多项: