spring webflux 中的 then、thenEmpty、thenMany 和 flatMapMany 是什么?

What is then, thenEmpty, thenMany and flatMapMany in spring webflux?

我不明白 Flux 上的 thenEmptythenManyflatMapMany 或 [= 中的 Mono 的用法和区别18=] 网络通量。

  • flatMap 对比 flatMapMany

在函数式编程中,flatMapreturns与承载方法的类型相同,所以对于Mono<T>flatMapreturns一个Mono。这意味着内部 Publisher 只能发出一个元素(或者它被截断)。我们通过让 Mono#flatMap 采取 Function<T, Mono<R>>.

来强制执行

因此,我们需要一种更随意的替代方案 Publisher,它可以发射多个元素。因此 Mono#flatMapMany(Function<T, Publisher<R>>) 其中 returns 一个 Flux<R>.

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

  • thenthenEmptythenMany

Mono 上的所有 thenXXX 方法都有一个共同的语义:它们忽略源 onNext 信号并对完成信号(onCompleteonError),此时使用各种选项继续序列。因此,这可以更改返回的通用类型 Mono:

  1. then 将只重播源终端信号,导致 Mono<Void> 表明这从不发出任何信号 onNext.
  2. thenEmpty不仅是returns一个Mono<Void>,它还需要一个Mono<Void>作为参数。它表示源完成信号 then 第二个 empty Mono 完成信号的串联。换句话说,当 A 然后 B 都按顺序完成并且不发出数据时,它就完成了。
  3. thenMany 等待源完成然后播放来自其 Publisher<R> 参数的所有信号,导致 Flux<R> 将 "pause" 直到源完成, then 在重播其完成信号之前从提供的发布者发出 many 元素。