2015-05-01 35 views
0

我有一個網絡調用,取決於多個UI元素的輸入。它基本上是一個交易界面,用戶可以選擇金額,貨幣和目的地等。在請求被解除之前,我需要驗證所有內容(例如,用戶的餘額是否有金額,目的地是否有效等)。對於所有這些網絡呼叫,我都有Observable,但我不確定要同時啓動所有這些呼叫並使用其結果來確定要採取的操作的最佳方式。RxJava:讀取多個訂閱並根據其結果執行操作?

基本上,理想的流程是每個條件都有一個失敗案例(我可以在代碼中爲每個案例確定),並且如果遇到任何這些失敗案例,則向用戶顯示錯誤,說明哪些輸入無效。如果所有檢查都通過,則將交易開除。

我應該怎麼辦?

回答

1

如果我理解正確的,你的觀測量的簽名類似於此:

// verifier Observables which perform network calls 
Observable<Verification1> test1 = ... 
Observable<Verification2> test2 = ... 
... 

// Observable to fire the transaction 
Observable<TransactionResult> fireTransaction = ... 

// represents the clicks on the "go" button of the UI 
Observable<Void> goButtonClicks = ... 

然後,你可以將所有這些觀測量如下:

goButtonClicks.flatMap(theVoid -> { 
    return Observable.zip(
     test1.subscribeOn(Schedulers.io()), 
     test2.subscribeOn(Schedulers.io()), 
     (v1, v2) -> { 
     if (v1 and v2 pass all your requirements) { 
      return fireTransaction; 
     } else { 
      return Observable.just(new TransactionFailure("error")); 
     } 
     } 
    ); 
}).subscribe(transactionResult -> { 
    UI.showMessage(transactionResult.getMessage()); 
}) 

.subscribeOn(Schedulers.io())電話給你並行的驗證網絡調用,並且zip允許您「等待」所有結果。

但是,我想在服務器端,出於安全考慮,您將不得不再次進行所有這些測試。因此,如果您可以更改體系結構,則可能需要始終「觸發」UI中的事務,讓服務器進行檢查,並將成功/失敗通知返回給UI。

+0

非常感謝,我會試試這個!我無法更改服務器行爲,因爲它是第三方API。 –