Java Reactor Flux/Mono,在元素发出之前或之后什么时候触发 doOnNext?

dvs*_*gec 5 java project-reactor

我有这个困惑,什么时候 doOnNext 是在 Publisher (Flux/Mono) 元素发射之前或之后触发的。

Mic*_*rry 8

这是后发布的元素-它成为定义之后,否则Consumer传递到doOnNext就无法获得所发出的元素。

但是,在订阅者之前doOnNext()调用。例如:

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

...会输出:

first onNext
first
second onNext
second
Run Code Online (Sandbox Code Playgroud)


Pra*_*dey 5

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

Flux<Integer> f = Flux.fromIterable(Arrays.asList(1,2,3));
Run Code Online (Sandbox Code Playgroud)

由于没有订阅者,因此什么也不会发生。不会发出任何项目。现在考虑这个:

f.subscribe(System.out::println)
Run Code Online (Sandbox Code Playgroud)

发生的事情是订阅者订阅了通量,并且项目被发射。

现在考虑这个:

f.doOnNext(System.out::println).subscribe(System.out.println);
Run Code Online (Sandbox Code Playgroud)

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