我有这种困惑,doOnNext 何时在 Publisher (Flux/Mono( 的元素发射之前或之后触发。
它是在元素发布之后 - 根据定义,它必须是在之后,否则传递给doOnNext
的Consumer
将无法访问发出的元素。
但是,doOnNext()
是在订阅者之前调用的。例如:
Flux.just("first", "second")
.doOnNext(x -> System.out.println(x + " onNext"))
.subscribe(System.out::println);
。将输出:
first onNext
first
second onNext
second
怕你还没有正确理解反应,这完全没问题:)。在 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()
截获每个事件并执行一些副作用。