Flux 完成时返回值?

Joh*_*han 2 reactive-programming spring-boot project-reactor spring-webflux

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

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

Run Code Online (Sandbox Code Playgroud)

即我想idsomeFlux完成后返回。该returnOnComplete函数是虚构的并且不存在(有一个doOnComplete函数,但它是为了副作用)这就是我问这个问题的原因。我怎样才能做到这一点?

g00*_*00b 6

您可以使用该then(Mono<V>)运算符,因为它根据文档完全符合您的要求:

让它Flux完成然后播放来自提供的信号Mono

换句话说,从 this 中忽略 elementFlux并将其完成信号转换为所提供的发射和完成信号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));
Run Code Online (Sandbox Code Playgroud)


Sim*_*slé 5

最重要的是then(Mono<V>),正如@g00glen00b 所建议的那样,thenReturn(V)当您的延续很简单时,有一种方法可以写得更短/更清晰Mono.just

mono.then(Mono.just("foo")); //is the same as:
mono.thenReturn("foo");
Run Code Online (Sandbox Code Playgroud)

  • `thenReturn` 仅适用于 `Mono`,不适用于 `Flux` (2认同)