RxJava 2 嵌套网络请求
RxJava 2 Nested Network Requests
在我目前正在开发的应用程序中,我使用改装来创建 Observable <ArrayList<Party>>
。
Party
有一个 hostId
字段以及一个 User
类型的字段,它在 Retrofits GsonConverter 创建时为空。我现在想使用 hostId
发出第二个请求,从 id 获取用户并将 User
添加到初始 Party
。我一直在研究平面图,但我还没有找到第一个可观察结果的结果不仅被保留而且被修改的例子。
目前,要让所有派对都没有 User
我正在做 :
Observable<ArrayList<Party>> partiesObs = model.getParties();
partiesObs.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handlePartyResponse, this::handleError);
我如何将 User
添加到每个 Party
而不必在初始调用的 onSuccess()
方法中调用 model.getUsers()
然后不必遍历两个列表?
我知道 flatmap()
returns 是一个新的 Observable,而 map
不是,但我不确定在这种情况下如何使用。
谢谢
如评论中所述,您应该尝试将后端 API 更改为类似这样的内容,以避免出现不雅和低效的解决方案。
如果这不可行,您可能会这样做:
.flatMapIterable(list -> list)
.flatMap(party -> model.getUser(party.hostId),
(party, user) -> new Party(user, party.hostId, party.dontCare))
其中:
flatMapIterable
将 Observable<ArrayList<Party>>
扁平化为 Observable<Party>
flatMap
的重载采用 Function
将发射(Party
个对象)转换为第一个 ObservableSource
(User
个对象)范围。第二个参数是 BiFunction
,用于组合 Party
和 User
对象,您可以使用它来创建完全成熟的 Party
对象。
如果您对 Party
对象执行 copy
或 clone
操作,那么最后一步会容易得多,该对象采用先前的实例并向其添加字段。
在我目前正在开发的应用程序中,我使用改装来创建 Observable <ArrayList<Party>>
。
Party
有一个 hostId
字段以及一个 User
类型的字段,它在 Retrofits GsonConverter 创建时为空。我现在想使用 hostId
发出第二个请求,从 id 获取用户并将 User
添加到初始 Party
。我一直在研究平面图,但我还没有找到第一个可观察结果的结果不仅被保留而且被修改的例子。
目前,要让所有派对都没有 User
我正在做 :
Observable<ArrayList<Party>> partiesObs = model.getParties();
partiesObs.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handlePartyResponse, this::handleError);
我如何将 User
添加到每个 Party
而不必在初始调用的 onSuccess()
方法中调用 model.getUsers()
然后不必遍历两个列表?
我知道 flatmap()
returns 是一个新的 Observable,而 map
不是,但我不确定在这种情况下如何使用。
谢谢
如评论中所述,您应该尝试将后端 API 更改为类似这样的内容,以避免出现不雅和低效的解决方案。
如果这不可行,您可能会这样做:
.flatMapIterable(list -> list)
.flatMap(party -> model.getUser(party.hostId),
(party, user) -> new Party(user, party.hostId, party.dontCare))
其中:
flatMapIterable
将Observable<ArrayList<Party>>
扁平化为Observable<Party>
flatMap
的重载采用Function
将发射(Party
个对象)转换为第一个ObservableSource
(User
个对象)范围。第二个参数是BiFunction
,用于组合Party
和User
对象,您可以使用它来创建完全成熟的Party
对象。
如果您对 Party
对象执行 copy
或 clone
操作,那么最后一步会容易得多,该对象采用先前的实例并向其添加字段。