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

反应流中不一致的doAfterTerminate行为

裴劲
2023-03-14

添加行为(副作用)在流量终止后触发,要么成功完成下游,要么出现错误。

这里有一个简单的例子来再现我面临的问题:

public static void main(String[] args) {
    boolean shouldThrow = true;
    Flux.just("string1" /* , "string2" */)
            // 1
            .materialize()
            // 2
            .doOnNext(s -> {
                if (shouldThrow)
                    throw new RuntimeException();
            })
            // 3
            .dematerialize()
            // 4
            .onErrorResume(t -> Flux.empty())
            .subscribe();
}

ShouldThrow标志简单地说明了在MaterializeDematerialize调用之间的代码可能引发错误。数字1到4表示为了本例的目的,我尝试插入doAfterTerminate调用的位置,doAfterTerminate(()->system.out.println(“after Terminate”)

    null

有人能解释一下上面的事情吗?这是图书馆的故意行为吗?

注意,我使用的是Reactor堆芯3.3.8。

共有1个答案

郎和志
2023-03-14

不是不一致的行为。

如你所知,通量发射0...n个元素。错误/完成信号关闭流。

当您实现时,真正发生的是,不是发送元素,而是发送包装在信号对象中的元素。流量 变为流量 > 。这甚至是一个完整的信号包装和发送作为一个对象在管道中,如图所示。

    boolean shouldThrow = false;
    Flux.just("string1" /* , "string2" */)
           //1
            .doOnNext(s -> System.out.println(s))
            .materialize()
            //2
            .handle(((stringSignal, synchronousSink) -> {
                synchronousSink.complete();
            }))
            .doOnNext(s -> {
                if (shouldThrow)
                    throw new RuntimeException();
            })
            .doAfterTerminate(() -> System.out.println("after terminate"))
            .dematerialize()
            // 4
            .onErrorResume(t -> Flux.empty())
            .subscribe();
 类似资料:
  • 我正在试着用我的机器人做右舷代码,其他一切都很好。但是我正在努力让机器人忽略实际消息作者的反应。 这是我当前的代码: 它返回以下错误:

  • 我不知道为什么我的反应角色代码不起作用。如果有人能帮助我,我将不胜感激! message函数用于缓存消息,以便bot可以检测对该消息的反应,如果确实需要的话,Idk。 也没有错误,只是没有给我角色。

  • 我一直试图让我的机器人回复用户时,他们的反应机器人表情,但没有运气,我希望有人能帮助我在这里,我只是一个初学者与不和谐。js。 这是我的代码,我只是需要帮助,当用户做出反应时,机器人会发送一条消息回来。

  • 我希望将反应添加到消息中的机器人,而不是我。有人能帮我吗?

  • 我开始用11.5discord.js写一个不和谐机器人。 我不想使用像,因为每个人都需要几天的时间才能添加自己的反应,而且它位于一个小的通道中,总是只通过几条消息来清理。 我正在通过提取一条特定的消息并希望从中读取现有的反应来获取旧消息。但我一直在阅读信息中的反应。 差不多 返回一个空数组。 文档提到不可能监听旧的消息反应,只有在12. x中可以。但是我没有使用监听器,所以我想这个限制在这种情况下

  • 我尝试使用Apache Camel(版本2.25.3)反应流和Spring Boot来读取一个大型csv文件,并使用Bindy解封这些行。这是“工作”,因为应用程序运行并检测文件,但我只看到流中文件的第一行。它似乎与Bindy相关,因为如果我从等式中去掉解组,我就可以在流中返回csv文件的所有行。我已经简化了这个问题,在这里演示了SO。我正在使用Spring Webflux来公开结果发布者。 所以