首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应堆3-如何在单次错误时返回通量?

反应堆3-如何在单次错误时返回通量?
EN

Stack Overflow用户
提问于 2018-08-30 16:10:49
回答 2查看 1.6K关注 0票数 2

这是样板代码:我想做这样的事情-

代码语言:javascript
复制
public Flux<Object2> getSomething(String email) {
    method1(email).map(result -> {  //method1 returns Mono<Object1>
        if(result.id().isEmpty()) {
            return method2(email); //method2 returns Flux<Object2>
        } else {
            return Flux.empty();
        }
    };
});

因此,当method1返回空的Object1.id()时,只调用method2。否则返回空通量。

要注意的指针是-

  1. 它没有到达第二个方法调用。
  2. 由于一种方法是Mono,另一种是Flux,所以如果我在第2行中直接添加返回,就会出现类型不匹配。
  3. 我在method1中尝试过这样的方法: 如果(Object1.id().isEmpty()){引发新的IllegalArgumentException;}

在上面的代码片段中:

代码语言:javascript
复制
try {
    method1(email);
} catch(IllegalArgumentException e) {
    return method2(email);
}

这里从来没有破例。

EN

回答 2

Stack Overflow用户

发布于 2018-08-30 20:06:32

您的第一个代码段不应该编译,因为方法实现没有重新调整任何内容,所以我将尝试猜测发生了什么。

这里不会发生任何事情,因为您正在创建的发布者不会被该方法返回。如果没有订阅那个Flux/Mono,什么都不会发生。

代码语言:javascript
复制
public Flux<Object2> getSomething(String email) {
    return method1(email)
              .filter(result -> result.id().isEmpty())
              .flatMapMany(result -> method2(email));
}

然后,可以使用filter筛选出结果,如果不满足谓词,则不从该Mono发出任何内容。此外,flatMapMany将帮助您在这里以预期的返回类型返回结果。

票数 3
EN

Stack Overflow用户

发布于 2018-09-01 06:43:48

您应该使用switchIfEmpty()运算符。

另外,如果希望从方法返回这两种类型(Mono和Flux),那么将返回类型更改为org.reactiveStreams.Publisher。不过,我不建议你这么做。

而是返回一个通量。即使只有一个数据可以返回,但仍然可以作为Flux返回。将Mono转换为Flux,如果它空用户switchIfEmpty操作符,则发送不同的Flux。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52101410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档