首页 > 解决方案 > 如何在 kotlin 中组成超过 8 个反应器 Mono

问题描述

我正在进行 10 个独立的网络调用,每个调用都返回一个不同类型的 Mono。这些调用可以并行运行。在他们全部完成后,我想根据结果计算一些东西。

Mono.zip(
            mono1(),
            mono2(),
            mono3(),
            ...        
            mono8()
        )

Mono.zip 最多允许我编写 8 个 Monos。我可以通过多次使用 zip 来解决问题,但这不是一个干净的方法。

Mono.zip(
            mono1(),
            mono2(),
            mono3(),
            ...
            mono8()
        ).zipWith(mono9())

使用数组可迭代Monos 以及组合函数的 zip 重载给了我Array<*>我丢失了所有单独的 Mono 类型的地方。

有没有更好的方法来组成这么多的 Monos ?

标签: kotlinfunctional-programmingproject-reactorcomposition

解决方案


您可以尝试根据某些共性将您的 Monos 分组为少于 8 个项目的组,然后将它们压缩在一起。

例子:

Mono.zip(
        getLocationInfo(),
        getHotelInfo(),
        { locationInfo, hotelInfo -> Hotel(hotelInfo, locationInfo) }
)

fun getHotelInfo(): Mono<HotelInfo> {
    return Mono.zip(
            getStarRating(),
            getAvailableRooms(),
            { starRating, rooms -> HotelInfo(starRating, rooms) }
    )
}

fun getLocationInfo(): Mono<Region> {

    return Mono.zip(
            getCoordinates(),
            getCountry(),
            { coordinates, country -> Region(coordinates, country) }
    )
}

推荐阅读