Project Reactor flatMap 顺序是顺序的吗?

Kyo*_*Lee 2 kotlin project-reactor spring-webflux

Flux 上的 flatMap 总是顺序的吗?我知道在 flatMap 中使用 then 函数返回通量时它不是顺序的。 项目反应器平面图

但是如果 flatMap 中使用的函数返回单声道,它是否总是顺序的?

假设我有一个函数,它接受一个对象并只返回 Mono。

fun aFunction(foo: Int): Mono<Int> {
    return (foo + 1).toMono()
}
Run Code Online (Sandbox Code Playgroud)

然后

Flux.just(1,2,3,4)
    .flatMap{ aFunction(it) }
Run Code Online (Sandbox Code Playgroud)

总是返回 2,3,4,5?

Pra*_*dey 7

不,aflatMap不是连续的。A急切地flatMap订阅内部流。以下是其工作原理的摘要:

  1. 从上游接收事件。
  2. 从中创建一个内部流。
  3. 订阅它。
  4. 从上游接收下一个事件。
  5. 从 2 开始重复。
  6. 合并来自所有这些内部流的事件。

由于这些内部订阅是并行发生的,因此无法保证哪个内部流将onComplete首先发出。因此,没有订购保证。

concatMap另一方面提供排序保证(按照从上游接收事件的确切顺序)。这是因为它仅在前一个流发出onComplete.

这是我不久前写的一篇文章flatMaphttps : //medium.com/swlh/understanding-reactors-flatmap-operator-a6a7e62d3e95

注意:您很可能会在输出中看到 2,3,4,5。这是因为您的调用是同步的。但不能保证,您永远不应该依赖flatMap任何类型的订购要求。

  • 请注意,在 `concatMap` 之上,还有 `flatMapSequential`,它是两者之间的中间立场:它订阅最多 N 个内部流,但缓冲它们产生的值,以便按源顺序输出它们 (5认同)