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
急切地 订阅了内部流。以下是其工作原理的摘要:
- 从上游接收事件。
- 从中创建一个内部流。
- 订阅它。
- 从上游接收下一个事件。
- 从 2 开始重复
- 合并来自所有这些内部流的事件。
由于这些内部订阅是并行发生的,因此无法保证哪个内部流将首先发出 onComplete
。因此,没有订购保证。
另一方面,concatMap
提供排序保证(按照从上游接收事件的确切顺序)。这是因为它仅在前一个流发出 onComplete
.
之后才订阅下一个流
这是我不久前在 flatMap
上写的一篇文章:
https://medium.com/swlh/understanding-reactors-flatmap-operator-a6a7e62d3e95
注意:您很可能会在输出中看到 2,3,4,5。这是因为您的呼叫是同步的。但是没有任何保证,您应该 永远不要 依赖 flatMap
来满足任何排序要求。
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
急切地 订阅了内部流。以下是其工作原理的摘要:
- 从上游接收事件。
- 从中创建一个内部流。
- 订阅它。
- 从上游接收下一个事件。
- 从 2 开始重复
- 合并来自所有这些内部流的事件。
由于这些内部订阅是并行发生的,因此无法保证哪个内部流将首先发出 onComplete
。因此,没有订购保证。
concatMap
提供排序保证(按照从上游接收事件的确切顺序)。这是因为它仅在前一个流发出 onComplete
.
这是我不久前在 flatMap
上写的一篇文章:
https://medium.com/swlh/understanding-reactors-flatmap-operator-a6a7e62d3e95
注意:您很可能会在输出中看到 2,3,4,5。这是因为您的呼叫是同步的。但是没有任何保证,您应该 永远不要 依赖 flatMap
来满足任何排序要求。