Reactor坑的点

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 aaa1(){
        return Mono.fromSupplier(() -> {
            int b = 222;
            return b;
        }).then();
    }

    public Mono aaa2(){
        return Mono.fromSupplier(() -> {
            int c = 333;
            return c;
        }).then();
    }

你可能感兴趣的:(Reactor坑的点)