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

Sag*_*han 11 java android reactive-programming rx-java rx-android

我有两个Observables.

  1. Observable<A> getAObservable() 返回Observable A
  2. Observable<B> getBObservable(A) 返回'B'的Observable.

这里Observable<A>应该先执行,Observable<B>以便它可以将结果传递AgetBObservable()方法.现在一旦Observable<B>完成,我需要结合这些结果observableObservable<AB>返回.

试用的选项:

  1. 对其Observable<A>应用并应用flatMap,以便将其转换为结果B.现在,此时我无法访问A数据.因此我无法返回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) {

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

zel*_*lla 6

flatMap文档.它有重载方法,适用于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);
            }
        }
      );
Run Code Online (Sandbox Code Playgroud)