【问题标题】:how to chain Dependant Observables accordingly如何相应地链接 Dependent Observables
【发布时间】:2018-02-28 16:14:33
【问题描述】:

RxJava 相对较新。有以下要求。任何指针都会有所帮助。 例如:- 有 3 个可观察对象 A、B、C 使得

  1. A 从 DB 等数据源发出数据
  2. B 和 C 都依赖于来自 A 的数据。
  3. B & C 应该并行执行
  4. Observable D 需要 B & C 压缩并产生组合结果。

尝试了类似下面的方法,但它没有解决上面的第 4 个问题,因为 D 压缩 (B,C) 需要 Observables B 和 C。

Observable<A>.just("AdataSource")
  .flatMap(Asdata->{ callB(Asdata) },(Asdata,BsResult)->{callC(AsData)};

【问题讨论】:

    标签: rx-java rx-java2


    【解决方案1】:

    您可以使用publish() 运算符的内部形式。

    Observable<A> dataSource;
    Observable<Pair<B, C>> dObservable = dataSource
      .publish( ds ->
        Observable.zip( callB( ds ), callC( ds ), (b, c) -> new Pair<>(b, c)));
    

    callB()callC() 方法具有以下签名:

    Observable<B> callB( Observable<A> dataSource );
    Observable<C> callC( Observable<A> dataSource );
    

    publish() 运算符所做的是将 observable 绑定到 ds,然后可以由 BC 观察者链共享。

    【讨论】:

    • 感谢@Bob Dalgleish。这有帮助!还想知道是否可以通过任何方式避免使用 Pair,以便可以接收 Observable,Observable
    • 您无法“接收”这对可观察对象。我使用Pair 作为zip() 将来自两个可观察值的值组合在一起的常用方法。您可以使用任何想要组合这些值的函数。
    【解决方案2】:

    您可以使用 ObservableBObservableC 的 zip 对您的 ObservableA 进行平面映射。

    假设这是您的 ObservableA、ObservableB 和 ObservableC。

    (Kotlin 中的示例代码)

    fun getObservableA(): Observable<Int> {
        return Observable.just(1, 2, 3)
    }
    
    fun getObservableB(num: Int): Observable<String> {
        return Observable.just("${num}A", "${num}B")
    }
    
    fun getObservableC(num: Int): Observable<String> {
        return Observable.just("${num}a", "${num}b", "${num}c")
    }
    

    您首先调用getObservableA() 并将其结果平面映射到getObservableB(num)getObservableC(num) 的压缩包。

    getObservableA()
            .flatMap { num ->
                Observable.zip(
                        getObservableB(num),
                        getObservableC(num),
                        BiFunction { t1: String, t2: String -> t1 to t2 }
                )
            }
            .subscribe(
                    { (t1, t2) ->
                        // This will emit 6 times as follows:-
                        //   t1 = 1A, t2 = 1a
                        //   t1 = 1B, t2 = tb
                        //   t1 = 2A, t2 = 2a
                        //   t1 = 2B, t2 = 2b
                        //   t1 = 3A, t2 = 3a
                        //   t1 = 3B, t2 = 3b
                    }
            )
    

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2018-01-03
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多