仅当第一个触发时才组合 2 个 Observable

Combining 2 Observables only if the first one fires

我是 Rx 的新手,我遇到了一种我没有找到任何相关信息的情况(或者我没有问正确的问题)。 我有一个应该触发特定方法的可观察对象。但是,要调用该方法,我需要来自第二个可观察对象的值(顺便说一下,它总是在第一个之前具有该值)。我如何将两者结合起来,以便仅在第一个可观察对象触发时调用该方法?它类似于 combineLatest,但如果任一 Observables 触发,则触发。 布, 丹尼尔

如果我对问题的理解正确,您可以使用 withLatestFrom 运算符,以便组合和后续发射由第一个 observable 门控。

与combine latest列在同一页面: http://reactivex.io/documentation/operators/combinelatest.html

很简单。一旦第一个 observable 完成,您只需调用另一个 observable,或者如果第二个 observable 依赖于第一个 observable 的连续数据接收,您需要在 onNext() 中调用第二个 observable。

以下代码试图说明可观察代码最终的样子。我还没有检查语法等错误所以使用下面的代码来制定一个想法。

Observable.just(getDataFromServer())
          .subscribeWith(new DisposableObserver() {
            ArrayList<MyData> dataList = new ArrayList<>();
            public void onNext(MyData d) {
                // call second observable here if it relies on batches of data the first observable has
                   dataList.add(d);
            }

            public void onComplete() {
               Observable.from(dataList).map(new Func1<MyData, String>() {
                  @Override public String call(MyData data) {
                       // apply your operations etc
                  }
              });
            }
});

您可以使用 Flatmap() 来做同样的事情 如果您使用 java 8 那么:

Observable.just(function1()).flatMap( dataFromFirstObservable-> 
        Observable.just(function2(dataFromFirstObservable))
    ).subscribe(resultFromSecondObservable -> {
        //perform action here
    });

如果使用 java 7

Observable.just(getData1()).flatMap(new Function<Integer, ObservableSource<?>>() {
        @Override
        public ObservableSource<?> apply(Integer integer) throws Exception {
            return Observable.just(function2(integer));
        }
    }).subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {
            //perform action here
        }
    });