同时执行两个 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(...);