2017-05-29 50 views
0

我在CompositeDisposable 3個Disposaple對象:添加新的訂閱時以前完成

CompositeDisposable disposables = new CompositeDisposable(); 

disposables.add(
    interactor1 
    .someMethod1() 
    .subscribe(...some handling logic)); 

disposables.add(
    interactor 
    .someMethod2() 
    .subscribe(...some handling logic)); 

disposables.add(
    interactor 
    .someMethod3() 
    .subscribe(...some handling logic)); 

前兩種方法返回一些數據,並將其傳送給其他方法。第一個兩個完成時必須調用第三個方法。我該怎麼做?

實施例的方法的簽名:

Single<List<String>> someMethod1(); 
Single<List<Integer>> someMethod2(); 
Single<String> someMethod3(); 
+1

您可能想要將前兩個與zip運算符結合起來,並調用訂閱中的第三個方法:http://reactivex.io/documentation/operators/zip.html – Matt

回答

0

你會zip第2個觀測量,然後對所述輸出使用flatmap。當兩個observable都生成一個值時,zip函數會投影一個項目,然後將組合的對象傳遞給flatmap,然後將其傳遞給第三個可觀察函數。

2

一個例子是勝過千言萬語:

public void SO() { 
    Single.zip(someMethod1(), 
      someMethod2(), 
      Pair::create) // (1) create pair from results of someMethod1 and someMethod2 
      .flatMap(methodsResultPair -> { 
       // (2) handling logic of combined result 
       // methodsResultPair.first is result of someMethod1 
       // methodsResultPair.second is result of someMethod2 
       return someMethod3(); 
      }) 
      .subscribe((resultOfMethod3, throwable) -> { 
       // process resultOfMethod3 
       // process error 
      }); 
} 

public Single<List<String>> someMethod1() { 
    return Single.just(Collections.<String>emptyList()) 
      .doOnSuccess(objects -> { /* (3) handling logic of someMethod1 result */ }); 
} 

public Single<List<Integer>> someMethod2() { 
    return Single.just(Collections.<Integer>emptyList()) 
      .doOnSuccess(objects -> { /* (4) handling logic of someMethod2 result */ }); 
} 

public Single<String> someMethod3() { 
    return Single.just(""); 
} 

有了這個,你有一個一次性的,而不是三個,因爲他們都是現在一個反應​​鏈的一部分。 Single.just()方法僅用於提供一些虛擬數據。