我是Spring webflux的新手。需要了解为什么即使数据不为空也会调用Mono.switchIfEmpty运算符。
示例代码:
public static void main(String[] args) {
Mono.just("test1")
.flatMap(val -> {
System.out.println("test2");
return Mono.just("test2");
})
.switchIfEmpty(method1())
.subscribe(s -> System.out.println(s));
}
private static Mono<String> method1() {
System.out.println("test3");
return Mono.empty();
}
输出
test3 测试2 测试2
答案 0 :(得分:2)
对于项目反应堆(通常在某种程度上在反应式编程中),事情发生在两个阶段:
Subscriber
订阅该管道后,该管道的实际执行在您的情况下,调用method1
将执行该方法,而您的System.out.println
将按预期执行。
如果您希望看到更多与管道执行相符的内容,可以尝试:
private static Mono<String> method1() {
return Mono.defer(() -> {
System.out.println("test3");
return Mono.empty()
});
}
Mono.defer
运算符将推迟该操作,直到订阅了管道为止。
尽管有更好的方法可以实现:
DoOnXYZ
运算符之一,这些运算符用于类似这样的副作用运算log()
运算符来更好地了解此处发生的情况(订阅,反压等)。