当前位置: 首页 > 知识库问答 >
问题:

Spring webflux在block、flatmap和

鄂育
2023-03-14

我有一个api需要调用3个其他api,第二个和第三个api调用依赖于第一个的结果。

webClient1.getApi1(request.getId())
   .subscribe(api1Response -> {
      if (api1Response.hasData()) {
         Mono<ApiTwoResponse> monoTwo = webClient2
            .post()
            .syncBody(...)
            .bodyToMono(ApiTwoResponse.class)
         monoTwo.subscribe(two -> log.info(two));

         Mono<ApiThreeResponse> monoThree = webClient3
            .put()
            .syncBody(...)
            .bodyToMono(ApiThreeResponse.class)
         monoThree.subscribe(three -> log.info(three));
      } 
});
Api1Response response = webClient1.getApi1(request.getId()).block()

我也尝试了flatmap,尽管这迫使您返回一些内容:

webClient1.getApi1(request.getId())
   .flatmap(api1Response -> {
      ...
      return Mono.empty();
});

对以上代码的任何帮助和反馈都很感激。

共有1个答案

南宫浩皛
2023-03-14

阻止操作,本质上是停止和等待。它相当于Java中的future.get()。它违背了非阻塞代码的目的。FlatMap将序列的序列扁平化为单个序列,因此列表{List{?}}将变成列表{Object}。subscribe基本上开始侦听,并可以执行操作。通常在订阅之前什么都不会发生。

但是对于您的用例,您可以使用filter这里有一个示例,它在{true,false}项上查看筛选器,然后对于每个为true的筛选器,我将两个mono的结果压缩在一起,然后用一个操作订阅

Flux<Boolean> bool = Flux.just(true, false);
    Mono<Integer> mono1 = Mono.just(1);
    Mono<String> mono2 = Mono.just("string");

    bool.filter(b -> b)
            .flatMap(b -> Mono.zip(mono1, mono2))
            .subscribe(tuple -> System.out.println(tuple.getT1() + ", " + tuple.getT2()));
 类似资料:
  • Jasmine还允许开发人员跳过一个或多个测试用例。 这些技术可以在Spec level或Suite level 。 根据应用程序的不同,此块可分别称为Skipping Spec和Skipping Suite 。 在以下示例中,我们将学习如何使用“x”字符跳过特定的Spec或Suite 。 跳过规格 我们将在语句之前使用“x”修改前面的示例。 describe('This custom match

  • flatMap 将 Observable 的元素转换成其他的 Observable,然后将这些 Observables 合并 flatMap 操作符将源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。 然后将这些 Observables 的元素合并之后再发送出来。 这个操作符是非常有用的,例如,当 Observable 的元素本身拥有其他的 Observ

  • 本文向大家介绍block、inline、inline-block的区别?相关面试题,主要包含被问及block、inline、inline-block的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。 block元素可以设置width,height属性。块级元素即使设置了宽度

  • 组件中传递的属性可以在块表达式中返回结果。 下表列出了使用块参数的不同方法 - S.No. BlockParam方式和描述 1 从具有yield的组件返回值 可以使用yield选项从组件返回值。 2 支持块和非块组件使用 您可以使用hasBlock属性支持单个组件使用块和非块组件。

  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。