Project Reactor flatMap 顺序是顺序的吗?

Is Project Reactor flatMap order sequential?

Flux 上的 flatMap 总是顺序的吗? 我知道在 flatMap return flux 中使用 then 函数时它不是顺序的。 project-reactor flatMap

但是如果flatMap中使用的函数returns mono,它会一直是顺序的吗?

假设我有一个接受对象的函数并且return只有 Mono。

fun aFunction(foo: Int): Mono<Int> {
    return (foo + 1).toMono()
}

然后

Flux.just(1,2,3,4)
    .flatMap{ aFunction(it) }

总是 return 2,3,4,5?

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

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

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

另一方面,

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

之后才订阅下一个流

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

注意:您很可能会在输出中看到 2,3,4,5。这是因为您的呼叫是同步的。但是没有任何保证,您应该 永远不要 依赖 flatMap 来满足任何排序要求。