Mono/Flux . defer 很重要,懒加载
then里面所有的代码都是饿汉式的,所以then里要用 defer
map/flatMap/then是常用的三个方法
使用map/flatMap则不会出现代码执行顺序问题
而使用then,则可能会出现顺序问题,取决于是否封装成方法
Mono/Flux后面跟 then()方法要注意以下点(代码执行顺序错乱问题):
1.如果直接在then()括号内部直接写Mono/Flux则不会有问题
2.如果then()括号内部是方法(就是把1上面的Mono/Flux包到方法里),则顺序会先走方法里的代码,再走then前面的代码,顺序错乱
idea断点看下面几个方法
正常的
@Test
public void test28(){
Mono.fromSupplier(() -> {
int a = 11;
return a;
}).then(Mono.fromSupplier(() -> {
int b = 222;
return b;
}).then())
.switchIfEmpty(Mono.fromSupplier(() -> {
int c = 333;
return c;
}).then())
.subscribe(x -> System.out.println(x));
}
有问题的(跟上面一模一样的代码,只不过把上面代码封装成方法)
@Test
public void test28(){
Mono.fromSupplier(() -> {
int a = 11;
return a;
}).then(aaa1())
.switchIfEmpty(aaa2())
.subscribe(x -> System.out.println(x));
}
public Mono<Void> aaa1(){
return Mono.fromSupplier(() -> {
int b = 222;
return b;
}).then();
}
public Mono<Void> aaa2(){
return Mono.fromSupplier(() -> {
int c = 333;
return c;
}).then();
}