Repeat操作符可以使流重新订阅,我发现了不同情况下的一些行为。
示例代码如下:
Mono.just(5)
.doOnNext(i -> System.out.println("next 1: " + i))
.doOnNext(i -> System.out.println("next 2: " + i))
.doOnNext(i -> System.out.println("next 3: " + i))
.repeat(2)
.subscribe();
输出:
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
当然是对的。然后我改变重复的位置。
Mono.just(5)
.doOnNext(i -> System.out.println("next 1: " + i))
.repeat(2)
.doOnNext(i -> System.out.println("next 2: " + i))
.doOnNext(i -> System.out.println("next 3: " + i))
.subscribe();
输出与之前相同。
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
next 1: 5
next 2: 5
next 3: 5
所以我认为它不能影响源流的执行顺序。
当我将then操作符添加到流中时。
Mono.just(5)
.doOnNext(i -> System.out.println("next 1: " + i))
.doOnNext(i -> System.out.println("next 2: " + i))
.then(Mono.just("hello"))
.doOnNext(i -> System.out.println("next 3: " + i))
.repeat(2)
.subscribe();
输出:
next 1: 5
next 2: 5
next 3: hello
next 1: 5
next 2: 5
next 3: hello
next 1: 5
next 2: 5
next 3: hello
它看起来像重新订阅了所有流,我再次更改位置。
Mono.just(5)
.doOnNext(i -> System.out.println("next 1: " + i))
.repeat(2)
.doOnNext(i -> System.out.println("next 2: " + i))
.then(Mono.just("hello"))
.doOnNext(i -> System.out.println("next 3: " + i))
.subscribe();
输出:
next 1: 5
next 2: 5
next 1: 5
next 2: 5
next 1: 5
next 2: 5
next 3: hello
这肯定会影响流的执行顺序。
然后我就疑惑了很多,什么情况下它会受影响还是不受影响?
非常感谢
1条答案
按热度按时间j9per5c41#
当你在
Flux
上调用then
运算符时,它将在Flux
完成之后**执行一次,包括重复。它不关心在它之前有多少个元素。这就是为什么你在上一个例子中只看到一个hello
。在行尾添加了注解,以查看两种类型之间的切换。如果
then
运算符出现在repeat
之前,则它将像其他操作一样重复