3

私はリアクティブ プログラミングが初めてで、2 つの API 呼び出しを並行して行い、結果を処理して単純な配列またはアイテムのリストを返したいと考えています。

私には 2 つの関数があり、1 つは Flux を返し、もう 1 つは Mono を返します。その Mono の結果に応じて、Flux が放出したアイテムに対して非常に単純なフィルタリング ロジックを作成します。

使用しようとしましzipWithたが、どのようなフィルタリング ロジックを使用しても、最後に到達したアイテムは 1 つだけでした。また、試してみまし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の Flux を返しますOfferDTO
  • getTaskのモノを返しますTaskDTO

私の質問に答えられない場合は、少なくとも複数の API 呼び出しを並行して実行し、WebClient で結果を待つ方法を教えてください。

4

3 に答える 3

1

すでにわかっているようzipWithに、 は を生成するためmin(a.size, b.size)、それらの 1 つがMono.

ただし、これら 2 つは独立しているため、簡単に分割できます。

val task: Mono<TaskDTO> = client.getTask(id)
val result: Flux<ViewOfferDTO> = 
task.flatMapMany {t ->
        client.getTaskOffers(id).map {offer ->
            t to offer
        }
    }.filter {
        it.second.workerUser.id == user.id || it.first.creatorUser == user.id
    }.map {
        it.second
}

要素のペアが必要な場合は、ビルトインを使用できることに注意してくださいPair

また、次のものしかないため、このチェックはあまり意味がありませんMonoit.first.creatorUser

于 2019-06-05T22:07:26.613 に答える