【问题标题】:Java Reactor Flux/Mono, when does doOnNext get triggered before or after element is emitted?Java Reactor Flux/Mono,doOnNext 何时在元素发出之前或之后触发?
【发布时间】:2019-12-03 20:45:55
【问题描述】:

我有这种困惑,doOnNext 何时在 Publisher (Flux/Mono) 元素发射之前或之后触发。

【问题讨论】:

标签: java project-reactor


【解决方案1】:

它在元素的 publication 之后 - 根据定义,它必须 在之后,否则传递给 doOnNextConsumer 将无法访问发出的元素。

但是,doOnNext() 被称为订阅者之前。例如:

Flux.just("first", "second")
        .doOnNext(x -> System.out.println(x + " onNext"))
        .subscribe(System.out::println);

...将输出:

first onNext
first
second onNext
second

【讨论】:

  • 和 doOnNext() 是可选的吗?这像钩子吗?
【解决方案2】:

恐怕您还没有正确理解响应式,这很好:)。在 Rx 中,订阅是自下而上的。考虑以下代码:

Flux<Integer> f = Flux.fromIterable(Arrays.asList(1,2,3));

由于没有订阅者,所以什么都不会发生。不会发出任何项目。现在考虑一下:

f.subscribe(System.out::println)

发生的情况是订阅者订阅了通量,并发出了项目。

现在考虑一下:

f.doOnNext(System.out::println).subscribe(System.out.println);

请记住,订阅是以自下而上的方式进行的。所以在这里,订阅者订阅了doOnNext(),而doOnNext() 订阅了原始的通量,然后开始发出事件。 doOnNext() 然后拦截每个事件并执行一些副作用。

【讨论】:

  • Prashant,我承认我仍在努力解决反应性问题。虽然问题来自我需要在发布者开始生成数据之前执行某些操作。
猜你喜欢
  • 2021-11-23
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多