同时执行两个 Monos 并取其中一个的结果
Execute two Monos concurrently and take result of one
假设我有两个 Monos,一个解析为 Void
/empty,另一个生成 Integer
,我如何并行执行两者,并继续作为 Mono<Integer>
.
具体来说,这两个 Monos 都是 WebClient
请求的结果。其中只有一个会产生有用的价值,但都需要成功才能继续。
例如
Mono<Void> a = sendSomeData();
Mono<Integer> b = getSomeNumber();
Mono<Integer> resultingStream = runConcurrentAndGetValue(a, b);
我该怎么写runConcurrentAndGetValue(a,b)
?
最初我不需要这个值,而是使用 Mono.when(a,b)
并在 Mono<Void>
的基础上构建。但现在我需要价值。我尝试使用 Mono.zip(a,b).map(Tuple2::getT2)
,但后来得知 zip
将取消 b
,因为 a
的基数较低 (0),结果将没有任何项目。
我可以使用 Mono.when(a).then(b)
,但我真的更希望能够同时执行这些。在这种情况下 operator/composition 使用什么是正确的?
编辑:
我能想到的一个选择就是发出一个未使用的值,例如:
Mono.zip(a.then(Mono.just("placeholder")), b).map(Tuple2::getT2)
您可以使用 reactor.core.publisher.Flux#merge(Publisher<? extends I>...)
方法并获取最后一个元素。
Mono<Integer> a = sendSomeData().then(Mono.empty);
Mono<Integer> b = getSomeNumber();
Mono<Integer> result = Flux.merge(a, b).last();
result.map(...);
假设我有两个 Monos,一个解析为 Void
/empty,另一个生成 Integer
,我如何并行执行两者,并继续作为 Mono<Integer>
.
具体来说,这两个 Monos 都是 WebClient
请求的结果。其中只有一个会产生有用的价值,但都需要成功才能继续。
例如
Mono<Void> a = sendSomeData();
Mono<Integer> b = getSomeNumber();
Mono<Integer> resultingStream = runConcurrentAndGetValue(a, b);
我该怎么写runConcurrentAndGetValue(a,b)
?
最初我不需要这个值,而是使用 Mono.when(a,b)
并在 Mono<Void>
的基础上构建。但现在我需要价值。我尝试使用 Mono.zip(a,b).map(Tuple2::getT2)
,但后来得知 zip
将取消 b
,因为 a
的基数较低 (0),结果将没有任何项目。
我可以使用 Mono.when(a).then(b)
,但我真的更希望能够同时执行这些。在这种情况下 operator/composition 使用什么是正确的?
编辑:
我能想到的一个选择就是发出一个未使用的值,例如:
Mono.zip(a.then(Mono.just("placeholder")), b).map(Tuple2::getT2)
您可以使用 reactor.core.publisher.Flux#merge(Publisher<? extends I>...)
方法并获取最后一个元素。
Mono<Integer> a = sendSomeData().then(Mono.empty);
Mono<Integer> b = getSomeNumber();
Mono<Integer> result = Flux.merge(a, b).last();
result.map(...);