【问题标题】:How to chain observables?如何链接可观察对象?
【发布时间】:2020-07-04 19:47:36
【问题描述】:

我需要链接两个可观察对象,第二个取决于第一个。 所以我有的是:

Observable 1 -> 请求返回 Observable

//kotlin
fun getTvShow(): Observable<TvShow> {
    return retrofitPetitionGetShow()...
}
//java
Observable<TvShow> getTvShow(){
    return retrofitPetitionGetShow()...
}

Observable 2 -> 返回 Single>

Observable.range(1, TvShow.totalSeasons)
            .flatMap { seasonNumber: Int ->
                retrofitPetitionGetSeason(seasonNumber)....
            }.toList()  

我需要的是第二个 observable (List) 的结果被添加到 TvShow 对象TvShow.setList(List&lt;Season&gt;) 然后返回它。

提前谢谢你

【问题讨论】:

  • 我不完全明白你在说什么。但我认为您正在寻找的是 zip 功能
  • @mohsen 但是如果第二个 observable 的请求需要作为 objectA 属性的参数,我可以使用 zip 吗?抱歉英语不是我的母语
  • observable1 是 makePetition 方法吗?什么是 observable2?尝试调整问题和代码sn -p/description
  • @mslowiak 我用(我认为)一个不太容易混淆的例子编辑了这个问题。
  • @wilkin25在下面发了答案,请看一下

标签: java kotlin rx-java reactive-programming reactivex


【解决方案1】:

根据 cmets 中提供的信息,您可以尝试使用以下代码(它是 Java 代码,但应该很容易将其转换为 Kotlin):

private Observable<TvShow> getTvShow() {
    return retrofitPetitionGetShow();
}

private Single<List<Season>> getSeasons(TvShow tvShow) {
    return Observable.range(1, tvShow.getTotalSeasons())
            .flatMap(seasonNumber -> retrofitPetitionGetSeason(seasonNumber))
            .toList();
}

public Observable<TvShow> chainObservables() {
    return getTvShow()
            .flatMap(tvShow -> getSeasons(tvShow).map(tvShow::withSeasons).toObservable());
}

重要!

在反应/功能方式中,您不应该修改对象,而是创建新对象(在您的情况下,有一个带有季节列表的 tvShow 更新)。有一个tvShow::withSeasons方法引用就是这样实现的:

public TvShow withSeasons(List<Season> seasons) {
        return this.seasons == seasons ? this : new TvShow(this.name, this.totalSeasons, seasons);
    }

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2015-01-12
    • 1970-01-01
    • 2021-12-30
    • 2018-06-03
    • 2018-10-25
    • 2018-06-07
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多