【问题标题】:What is then, thenEmpty, thenMany and flatMapMany in spring webflux?那么 spring webflux 中的然后是 Empty、thenMany 和 flatMapMany 是什么?
【发布时间】:2018-06-23 14:22:35
【问题描述】:

我不明白spring webflux中FluxMonothenEmptythenManyflatMapMany的用途和区别。

【问题讨论】:

标签: spring project-reactor spring-webflux


【解决方案1】:
  • flatMap vs flatMapMany

在函数式编程中,flatMap 返回的类型与承载该方法的类型相同,因此对于Mono<T>flatMap 返回一个Mono。这意味着内部Publisher 只能发出一个元素(或者它被截断)。我们通过让Mono#flatMap 接受Function<T, Mono<R>> 来强制执行这一点。

因此,我们需要一种更任意的Publisher 替代方案,它可以发出多个元素。因此Mono#flatMapMany(Function<T, Publisher<R>>) 返回一个Flux<R>

TL;DR:Mono#flatMap 用于 异步 但源中元素的 1 对 1 转换 Mono, Mono#flatMapMany 用于 1 对 N 异步 转换(如 Flux#flatMap)。

  • thenthenEmptythenMany

Mono 上的所有 thenXXX 方法都有一个共同的语义:它们忽略源 onNext 信号并对完成信号(onCompleteonError)作出反应,在这一点上继续使用各种选项。因此,这可能会更改返回的Mono 的泛型类型:

  1. then 只会重播源终端信号,从而产生 Mono<Void> 以表明这不会向任何 onNext 发出信号。
  2. thenEmpty 不仅返回一个Mono<Void>,而且还接受一个Mono<Void> 作为参数。它表示源完成信号然后第二个empty单声道完成信号的串联。换句话说,当 A 和 B 都按顺序完成并且不发出数据时,它就完成了。
  3. thenMany 等待源完成,然后播放来自其 Publisher<R> 参数的所有信号,导致 Flux<R> 将“暂停”直到源完成,然后发出 在重放完成信号之前,来自提供的发布者的许多元素。

【讨论】:

  • 我正在使用thenMany 继续在警卫之后。这是一个很好的模式吗? IE。如果前置条件失败,守卫返回Mono.error(...),否则返回Mono.empty()。然后我有 thenMany 继续计算并在我的 webflux 应用程序中返回 Flux
  • 是的,应该可以工作@wilmol,虽然我想Mono.error 是在flatMap 中使用的(你称之为“守卫”)?在这种情况下,直接在平面图的 else 分支中返回 Flux 而不是从 thenMany
  • 请注意,所有 then Mono 都会被订阅,尽管其中任何一个都会引发错误,而 map 不会
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 2011-03-09
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多