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

时间:2017-08-09 18:54:04

标签: rx-java rx-android rx-java2 reactivex

我对Rx很陌生,我的情况是我找不到任何相关的东西(或者我可能不会问正确的问题)。 我有一个可以触发特定方法的observable。然而,要调用该方法,我需要来自第二个observable的值(它将在第一个之前始终具有该值)。如何组合这两个,以便只在第一个observable触发时才调用该方法?它就像使用combineLatest一样,但如果Observable中的任何一个发射,那就会触发。 BR, 丹尼尔

3 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你可以使用withLatestFrom运算符,以便组合和后续发射被第一个可观测值门控。

它与最新组合列在同一页面上: http://reactivex.io/documentation/operators/combinelatest.html

答案 1 :(得分:0)

这很简单。一旦第一个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
                  }
              });
            }
});

答案 2 :(得分:0)

您可以使用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
        }
    });