Flux 完成时的返回值?

Posted

技术标签:

【中文标题】Flux 完成时的返回值?【英文标题】:Return value when Flux completes? 【发布时间】:2019-06-15 22:54:07 【问题描述】:

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

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


即我想在someFlux 完成后返回idreturnOnComplete 函数是虚构的并且不存在(有一个 doOnComplete 函数,但它用于副作用)这就是我问这个问题的原因。我该怎么做?

【问题讨论】:

【参考方案1】:

then(Mono&lt;V&gt;) 之上,正如@g00glen00b 所建议的那样,当您的继续是一个简单的Mono.just 时,还有一个thenReturn(V) 方法更短/更清晰:

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

【讨论】:

【参考方案2】:

您可以使用then(Mono&lt;V&gt;) 运算符,因为它完全符合the documentation 的要求:

让这个Flux 完成,然后播放来自提供的Mono 的信号。

换句话说,忽略此Flux 中的元素并将其完成信号转换为提供的Mono&lt;V&gt; 的发射和完成信号。在生成的Mono&lt;V&gt; 中重放错误信号。

例如:

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));

【讨论】:

以上是关于Flux 完成时的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

React + Flux:动作可以返回值吗? (例如最后创建的 id)

无法从 Flux / Mono 读取值

计算平均值时的意外返回值?

WebClient 停止从 Flux 读取时的异常

使用 cProfile 时的返回值

返回标识值时的 ExecuteScalar 与 ExecuteNonQuery