gpt4 book ai didi

spring-webflux - Spring webflux block、flatmap 和 subscribe 的区别

转载 作者:行者123 更新时间:2023-12-04 06:44:32 24 4
gpt4 key购买 nike

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

我对执行此操作的最佳方法以及使用 block、subscribe 和 flatmap 之间的区别感到有些困惑。所有这三种方法都对我有用,但我不确定哪一种是最好的。

这是我目前拥有的:

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));
}
});

我也试过 block 虽然这似乎不鼓励:
Api1Response response = webClient1.getApi1(request.getId()).block()

我也尝试过 flatmap 虽然这迫使你返回一些东西:
webClient1.getApi1(request.getId())
.flatmap(api1Response -> {
...
return Mono.empty();
});

对上述代码的任何帮助和反馈表示赞赏。

最佳答案

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

但是对于您的用例,您可以使用 filter这是一个例子,
它看起来过滤了 {true, false} 项,然后对于每个为真的过滤器,
我将两个单声道的结果压缩在一起,然后订阅一个 Action

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()));

关于spring-webflux - Spring webflux block、flatmap 和 subscribe 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52744418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com