【发布时间】:2018-06-23 14:22:35
【问题描述】:
我不明白spring webflux中Flux或Mono上thenEmpty、thenMany和flatMapMany的用途和区别。
【问题讨论】:
标签: spring project-reactor spring-webflux
我不明白spring webflux中Flux或Mono上thenEmpty、thenMany和flatMapMany的用途和区别。
【问题讨论】:
标签: spring project-reactor spring-webflux
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)。
then、thenEmpty 和 thenManyMono 上的所有 thenXXX 方法都有一个共同的语义:它们忽略源 onNext 信号并对完成信号(onComplete 和 onError)作出反应,在这一点上继续使用各种选项。因此,这可能会更改返回的Mono 的泛型类型:
then 只会重播源终端信号,从而产生 Mono<Void> 以表明这不会向任何 onNext 发出信号。thenEmpty 不仅返回一个Mono<Void>,而且还接受一个Mono<Void> 作为参数。它表示源完成信号然后第二个empty单声道完成信号的串联。换句话说,当 A 和 B 都按顺序完成并且不发出数据时,它就完成了。thenMany 等待源完成,然后播放来自其 Publisher<R> 参数的所有信号,导致 Flux<R> 将“暂停”直到源完成,然后发出 在重放完成信号之前,来自提供的发布者的许多元素。
【讨论】:
thenMany 继续在警卫之后。这是一个很好的模式吗? IE。如果前置条件失败,守卫返回Mono.error(...),否则返回Mono.empty()。然后我有 thenMany 继续计算并在我的 webflux 应用程序中返回 Flux。
Mono.error 是在flatMap 中使用的(你称之为“守卫”)?在这种情况下,直接在平面图的 else 分支中返回 Flux 而不是从 thenMany
then Mono 都会被订阅,尽管其中任何一个都会引发错误,而 map 不会