RxJava/Android:合并两个依赖的 Observables 的结果

RxJava/Android: Combine result of two dependent Observables

我有两个Observables

  1. Observable<A> getAObservable() Returns 可观察到 A
  2. Observable<B> getBObservable(A) Returns 可观察到 'B'。

此处 Observable<A> 应该在 Observable<B> 之前执行,以便它可以将其结果 A 传递给 getBObservable() 方法。现在,一旦 Observable<B> 完成,我需要合并这些 observableObservable<AB> 的结果应该 returns.

尝试过的选项:

  1. Observable<A> 并在其上应用 flatMap 使其变换 结果 B。现在我无法访问 A 数据。 因此我不能 return Observable

    1. 我可以使用 zip,这样一旦我得到 Observable<A>Observable<B> 的结果,我就可以将它们的结果结合起来 AB。但是在这里我不能设置 Observable<A> 应该的依赖 在 Observable<B> 之前执行,我无法传递结果 Observable<A>Observable<B>

代码库:

public class Data {

    A a = new A();
    public Observable<AB> getABContext() {
        A a = new A();

        return getAObservable()
                .flatMap(new Func1<A, Observable<AB>>() {
                    @Override
                    public Observable<AB> call(final A a) {
                        return getBObservable(a)
                                .flatMap(new Func1<B, Observable<AB>>() {
                                    @Override
                                    public Observable<AB> call(B b) {
                                        return Observable.just(new AB(a, b));
                                    }
                                });
                    }
                });
    }

    private Observable<A> getAObservable() {
        return Observable.just(a);
    }

    private Observable<B> getBObservable(A a) {
        return Observable.just(new B(a));
    }

    private static class A {

    }

    private static class B {
        B (A a) {

        }
    }

    private static class AB {
        AB (A a, B b) {

        }
    }

}

参见flatMap documentation。它有重载方法,应用 zip 函数:

    Observable<Pair<A, B>> abObservable = getAObservable()
      .flatMap(
        new Func1<A, Observable<? extends B>>() {
            @Override
            public Observable<? extends B> call(A a) {
                return getBObservable(a);
            }
        },
        new Func2<A, B, Pair<A, B>>() {
            @Override
            public Pair<A, B> call(A a1, B b1) {
                return new Pair<>(a1, b1);
            }
        }
      );