Flux完成后返回值?

时间:2019-01-22 12:56:50

标签: spring-boot reactive-programming spring-webflux project-reactor

我想在Flux完成后返回一个值(或发布者)。这是一个带有(伪)代码的示例,类似于我的代码:

val myId : Mono<String> = fetchMyId()
myId.flatMap { id ->
     someFlux.map { .. }.doOnNext { ... }.returnOnComplete(Mono.just(id))
}

即我想在id完成后返回someFluxreturnOnComplete函数是虚构的,并且不存在(有一个doOnComplete函数,但是它是有副作用的),这就是为什么我问这个问题。我该怎么办?

2 个答案:

答案 0 :(得分:3)

您可以使用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));

答案 1 :(得分:3)

如{g1glen00b所建议的那样,在then(Mono<V>)之上,有一个thenReturn(V)方法,当您的延续是简单的Mono.just时,它的编写/清除方法会更短一些:

mono.then(Mono.just("foo")); //is the same as:
mono.thenReturn("foo");