Я новичок в реактивном программировании и хотел бы выполнить два вызова API параллельно, обработать результаты и вернуть простой массив или список элементов.
У меня есть две функции: одна возвращает Flux, а другая - Mono, и я создаю очень простую логику фильтрации для элементов, излучаемых Flux, в зависимости от результата этого Mono.
Я пробовал использовать 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
возвращает моноTaskDTO
Если вы не можете ответить на мой вопрос, скажите мне хотя бы, как выполнять несколько вызовов API параллельно и ждать результатов в WebClient.