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 中提供的示例和类型。为了获得正常的列表,您需要订阅单人,但我认为订阅部分在这里不是问题。
我是 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 中提供的示例和类型。为了获得正常的列表,您需要订阅单人,但我认为订阅部分在这里不是问题。