繁体   English   中英

RxJava 调用链

[英]Chain of RxJava calls

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

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

LocationList 定义为

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 中您将可以访问您的位置并且您可以返回您的集线器。 这将返回一个包含普通列表的Single ,因此您需要将其转换为项目流。 您可以通过flattenAsObservable()操作符来完成它,它将您的集线器列表作为 Observable 序列发出。 接下来,您可以使用flatMapSingle() ,您可以在其中返回您的房间。 访问您的房间后,您现在拥有创建 HubItem 所需的所有数据,您将使用Single.just(...)将其作为单个发出。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM