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))

其中:

  1. flatMapIterableObservable<ArrayList<Party>> 扁平化为 Observable<Party>
  2. flatMap 的重载采用 Function 将发射(Party 个对象)转换为第一个 ObservableSourceUser 个对象)范围。第二个参数是 BiFunction,用于组合 PartyUser 对象,您可以使用它来创建完全成熟的 Party 对象。

如果您对 Party 对象执行 copyclone 操作,那么最后一步会容易得多,该对象采用先前的实例并向其添加字段。