首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava调用链

RxJava调用链
EN

Stack Overflow用户
提问于 2022-05-25 14:55:55
回答 1查看 77关注 0票数 0

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

代码语言:javascript
复制
Location(location_id, location_name)
Hub(hub_id, hub_name, location_id)
Room(device_id, room_id, room_name)

LocationList被定义为

代码语言:javascript
复制
LocationList: List<Location>

要求是

代码语言:javascript
复制
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> .How,通过RxJava实现上述功能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 03:10:33

您需要使用很少的RxJava运算符来完成它,您可以嵌套它们,以便跟踪创建HubItem所需的值。

代码语言:javascript
复制
        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.fromIterable()将创建一个项目流,然后在第一个flatMap中,您可以访问您的位置并返回集线器。这将返回包含普通列表的Single,因此需要将其转换为项目流。您可以通过flattenAsObservable()操作符来完成它,它将把集线器列表作为可观察的序列发出。接下来,您可以使用flatMapSingle(),在那里您可以返回您的房间。通过访问您的房间,您现在拥有了创建HubItem所需的所有数据,您将使用Single.just(...)作为一个单独的数据发出它。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72379938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档