我是响应式编程的新手,我想并行进行两个 API 调用并处理结果并返回一个简单的数组或项目列表。
我有两个函数,一个返回 Flux,另一个返回 Mono,我根据 Mono 的结果对 Flux 发出的项目进行了非常简单的过滤逻辑。
我尝试使用zipWith
,但无论采用何种过滤逻辑,只有一项完成。我也尝试过,block
但控制器内部不允许这样做:/
@GetMapping("/{id}/offers")
fun viewTaskOffers(
@PathVariable("id") id: String,
@AuthenticationPrincipal user: UserPrincipal
) : Flux<ViewOfferDTO> {
data class TaskOfferPair(
val task: TaskDTO,
val offer: ViewOfferDTO
)
return client.getTaskOffers(id).map {
it.toViewOfferDTO()
}.zipWith(client.getTask(id), BiFunction {
offer: ViewOfferDTO, task: TaskDTO -> TaskOfferPair(task, offer)
}).filter {
it.offer.workerUser.id == user.id || it.task.creatorUser == user.id
}.map {
it.offer
}
}
getTaskOffers
返回一个通量OfferDTO
getTask
返回一个 MonoTaskDTO
如果您无法回答我的问题,请至少告诉我如何并行执行多个 API 调用并等待 WebClient 中的结果