如何有条件地执行then(Mono<T>)
运算符?
我有一个返回then
的方法。它还可以返回错误信号。我只想在没有错误信号的情况下完成上一个操作时才使用 public static void main(String[] args) {
Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
.flatMap(s -> firstMethod(s))
.then(secondMethod())
.subscribe()
;
}
运算符(或任何其他运算符)。
有人可以帮助我找到合适的供应商吗?
private static Mono<String> secondMethod() {
//This method call is only valid when the firstMethod is success
return Mono.just("SOME_SIGNAL");
}
private static Mono<Void> firstMethod(String s) {
if ("BAD_SIGNAL".equals(s)) {
Mono.error(new Exception("Some Error occurred"));
}
return Mono
.empty()//Just to illustrate that this function return Mono<Void>
.then();
}
{{1}}
-谢谢
答案 0 :(得分:0)
then
在其来源中传播错误,因此涵盖了这一方面。据我了解,不能使用flatMap
而不是then
的原因是由于firstMethod()
,源是空的。在这种情况下,请结合defer()
和then()
来实现您所追求的懒惰:
Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
.flatMap(s -> firstMethod(s))
.then(Mono.defer(this::secondMethod))
.subscribe();
答案 1 :(得分:0)
好吧,所以,首先,我想强调一下Reactor的Mono / Flux(接下来将考虑使用Mono)具有以下条件运算符(至少我所知道的):
Mono#swithIfEmpty
Mono#defaultIfEmpty
Mono#filter
和其他一些供应商运营商(例如Mono#flatMap
)的组合第二点是我想注意到Mono#then
:
忽略此Mono的元素,并将其完成信号转换为提供的Mono的发射和完成信号。在生成的Mono中重播错误信号。
因此,这意味着then
仍将返回值(空值或提供的值)
考虑所有这些,您的解决方案将如下所示:
public static void main(String[] args) {
Mono.just("GOOD_SIGNAL")//It can also be a BAD_SIGNAL
.flatMap(s -> firstMethod(s))
.switchIfEmpty(secondMethod())
.doOnError(...)//handle you error here
.subscribe();
}
private static Mono<String> secondMethod() {
//This method call is only valid when the firstMethod is success
return Mono.just("SOME_SIGNAL");
}
private static Mono<Void> firstMethod(String str) {
return Mono.just(str)
.filter(s -> "BAD_SIGNAL".equals(s))
.map(s -> new Exception("Some Error occurred: "+s))
.flatMap(Mono::error);
}