【问题标题】:Return value when Flux completes?Flux 完成时的返回值?
【发布时间】:2019-06-15 22:54:07
【问题描述】:
我想在Flux 完成后返回一个值(或发布者)。这是一个类似于我所追求的(伪)代码的示例:
val myId : Mono<String> = fetchMyId()
myId.flatMap { id ->
someFlux.map { .. }.doOnNext { ... }.returnOnComplete(Mono.just(id))
}
即我想在someFlux 完成后返回id。 returnOnComplete 函数是虚构的并且不存在(有一个 doOnComplete 函数,但它用于副作用)这就是我问这个问题的原因。我该怎么做?
【问题讨论】:
标签:
spring-boot
reactive-programming
spring-webflux
project-reactor
【解决方案1】:
在then(Mono<V>) 之上,正如@g00glen00b 所建议的那样,当您的继续是一个简单的Mono.just 时,还有一个thenReturn(V) 方法更短/更清晰:
mono.then(Mono.just("foo")); //is the same as:
mono.thenReturn("foo");
【解决方案2】:
您可以使用then(Mono<V>) 运算符,因为它完全符合the documentation 的要求:
让这个Flux 完成,然后播放来自提供的Mono 的信号。
换句话说,忽略此Flux 中的元素并将其完成信号转换为提供的Mono<V> 的发射和完成信号。在生成的Mono<V> 中重放错误信号。
例如:
Mono
.just("abc")
.flatMap(id -> Flux.range(1, 10)
.doOnNext(nr -> logger.info("Number: {}", nr))
.then(Mono.just(id)))
.subscribe(id -> logger.info("ID: {}", id));