RxJava 调用链

Chain of RxJava calls

我是 RxJava 的新手。我正在努力链接多个 API 调用。 class个结构如下:

Location(location_id, location_name)
Hub(hub_id, hub_name, location_id)
Room(device_id, room_id, room_name)

位置列表定义为

LocationList: List<Location>

要求是

forEach location in LocationList{ location->
    getHubs(location.location_id)  //returns Single<List<Hub>>
    forEach hub in hubList{ hub->
       getRoom(hub.hub_id) // returns Single<Room>
       store HubItem(
            location.location_id,
            location.location_name,
            hub.hub_id,
            hub.hub_name,
            room_name
       ) in a list
    }
}

output list

最终输出的是一个List<HubItem>。如何通过RxJava实现以上?

您将需要使用一些 RxJava 运算符来完成它,您可以嵌套它们以跟踪创建 HubItem 所需的值

        val hubItems: Single<List<HubItem>> = Observable.fromIterable(locations)
        .flatMap { location ->
            getHubs(location.location_id)
                .flattenAsObservable { it }
                .flatMapSingle { hub ->
                    getRoom(hub.hub_id)
                        .flatMap { room ->
                            Single.just(
                                HubItem(
                                    location_name = location.location_name,
                                    locationId = location.location_id,
                                    hub_id = hub.hub_id,
                                    hub_name = hub.hub_name,
                                    room_name = room.room_name
                                )
                            )
                        }
                }
        }.toList()

这是实现它的一种方法。首先,您需要从您的列表中创建 Observable 流,Observable.fromIterable() 将创建一个项目流,然后在第一个 flatMap 中您将可以访问您的位置并且您可以 return 您的枢纽。这是 returning 包含普通列表的 Single,因此您需要将其转换为项目流。您可以完成它,即通过 flattenAsObservable() 运算符,它会将您的中心列表作为 Observable 序列发出。 接下来,您可以使用 flatMapSingle(),在这里您可以 return 您的房间。访问您的房间后,您现在拥有创建 HubItem 所需的所有数据,您将使用 Single.just(...).

将其作为单个发出

最后,您可以使用 toList() 运算符将所有发出的项目收集到 Single<List<HubItem>> 中。当然有多种方法可以实现它,但这应该反映您在 pseudo-code 中提供的示例和类型。为了获得正常的列表,您需要订阅单人,但我认为订阅部分在这里不是问题。