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