2017-07-20 20 views
0

我試圖一次執行兩個Maybe,並在完成這兩個操作後調用特定的方法。如果兩個Observables都返回一個值,但這在某些情況下可能不會發出一個項目,因此只調用doOnComplete而不是doOnSuccess。因此,如果其中一個Maybes'沒有調用doOnSuccess,那麼zip()塊將不會執行。我想知道如何處理這種情況?使用帶有可能不會發出值的Maybe的zip()

繼我的代碼(精簡的必要部分):

private void fetchData(){ 
    Maybe<Integer> maybeOne = getId(); // may return Maybe.empty() 
    Maybe<List<String>> maybeTwo = getList(); 
    Maybe.zip(maybeOne, maybeTwo, (id, list) -> { 
     initView(id, list); // only called if values have been emitted 
     return true; 
    }).subscribe(); 
} 

我預料的zip()塊總是被調用,但在情況下空值也許沒叫onSuccess。情況並非如此,我可以如何處理這種情況?

回答

3

您可以使用materialize運算符。它基本上將串行調用轉換爲對象(包裝在Notification對象內)。

Observable.zip(maybeOne.toObservable().materialize(), 
       maybeTwo.toObservable().materialize(), (id, list) -> { 
        Log.d(TAG, "zip completed"); 
        return true; 
       }).subscribe(); 

現在你zip始終將「完成」,但你真正的數據可以通過檢索:

id.getValue() 

如果你的也許是Maybe.empty()那麼它將不會返回值,而空。

+0

這正是我需要的 - 謝謝 – user3420815

相關問題