您应该什么时候阻止/订阅 Mono/Flux?

When should you block / subscribe to a Mono/Flux?

假设你有一些通量和单声道

val people: Flux<Person> = repo.getPeople()
val peopleCount: Mono<Int> = people.count()

来自例如一个 WebFlux 控制器你 return 一个 Mono:

data class Response(
    val people: List<People>,
    val personCount: Int
)

将通量和单声道分别解析为 List 和 Int 的应用程序中的适当位置在哪里?你只是阻止()一切吗?有没有办法让框架解决一切?

编辑:我想我的主要困惑是我看到的所有教程响应对象中的字段实际上不是反应性的,所以看起来我需要在 returning 对象之前解决所有问题从控制器。如果响应对象看起来像这样对我来说会更有意义

data class Response(
    val people: Flux<People>,
    val personCount: Mono<Int>
)

如果您在 servlet 世界中使用反应器,您只能阻止,即使那样您也可以传回 Mono/Flux,这将是一个异步请求。

举个例子,

return repo.getPeople().collectList().map( people -> new response(peoples, people.count())

最终成为框架将订阅的 Mono<Response>

您需要在 Mono/Flux 上使用运算符,而不是阻塞反应链。我建议查看 Reactor java 文档。每个操作员都有很好的图表,可以直观地了解操作员正在做什么。