2016-10-22 6 views
0

シナリオ:複数の異なるバックエンドシステムをクエリするために使用するcustomerID文字列があります。カレンダー、ヘルプデスク、ERP、CRMなどです。単一のレポートをコンパイルします。 は、だから私は(psydocode)おおよそ持っている:複数の観測可能な要素が返されるのを待つ

Result myResult = new Result(); 
Observable<Cal> cal = Calbackend.get(customerid); 
cal.subscribe(calentry -> myResult.addCal(calentry)); 

Observable<Erp> erp = ERPbackend.get(customerid); 
erp.subscribe(erpentry -> myResult.addErp(erpentry)); 

Observable<Help> help = Helpbackend.get(customerid); 
help.subscribe(helpentry -> myResult.addHelp(helpentry)); 

Observable<Crm> crm = CRMbackend.get(customerid); 
crm.subscribe(crmentry -> myResult.addCrm(crmentry)); 

// Magic here? 

return result; 

私が考えていたアプローチ:開始を防止し、その後、さらにそれぞれのcount()を購読するdefer()を使用します。それで、それぞれが単一のアイテムを出すだけなので(他のイベントは異なる数のイベントを持ちます)、カウント要素をZIPすることができます。ただし、myResult.addcount()より遅い場合は、データが失われる可能性があります。

私が考えていたもう1つのオプションは、各サブスクリプションに対してブール値フラグの配列を設定し、すべての完了(およびエラー)イベントをチェックしてコールバックを実行するか、

私は一見がherehereでしたが、その例は定数またはデータ型を扱っています。

もっと良い/お勧めの方法がありますか?

+1

あなたはこれらの観測から、複数の排出を期待していますか?もしそうであれば、 'toList'演算子を使うことができます。演算子は、Observableソースが完了したときに、出力されたすべての項目をリストにコンパイルして出力します。その後、4つのオブザーバブルリストをまとめてまとめ、結果を構成することができます。 – ehehhh

+1

はい。各観測対象には未知数の排出量があります。番号は関連していません。 toList演算子は挿入順序を保持するリストを返しますか?あなたのコメントを受諾 – stwissel

答えて

1

オペレーターtoListこのようなzipと一緒に使用することができる。

Observable<List<Cal>> cal = Calbackend.get(customerid).toList(); 
Observable<List<Erp>> erp = ERPbackend.get(customerid).toList(); 
Observable<List<Help>> help = Helpbackend.get(customerid).toList(); 
Observable<List<Crm>> crm = CRMbackend.get(customerid).toList(); 
Observable.zip(cal, erp, help, crm, 
       new Func4<List<Cal>, List<Erp>, List<Help>, List<Crm>, Result>() { 
        @Override 
        public Result call(List<Cal> cals, List<Erp> erps, List<Help> helps, List<Crm> crms) { 
         Result myResult = new Result(); 
         // add all cals, erps, helps and crms to result 
         return myResult; 
        } 
       }) 
       .subscribe(new Subscriber<Result>() { 
        @Override 
        public void onNext(Result result) { 
         // do something with the result 
        } 

        ... 
       }); 

説明:名前が示すように、toListオペレータが観察源によって放出されたアイテムのリストを作成(リストが放出されますソースオブザーバブルが完了した時点で1回だけ)、オブザーバブルの結果を結合するためにzipが使用されます。

編集:これらの観測がエラーを発することができる、あなたが行くの通常の流れを維持するためにonErrorReturnを使用することができる可能性の場合は

Observable<List<Cal>> cal = Calbackend.get(customerid) 
      .onErrorReturn(new Func1<Throwable, Cal>() { 
       @Override 
       public Cal call(Throwable throwable) { 
        // Return something in the error case 
        return null; 
       } 
      }) 
      .toList(); 
+0

Thxの回答に変えてください。今度は、エラーの場合の.toList()の動作を評価する必要があります。私は5要素を取得し、次にエラーが発生します。私はリストも良いものも得られませんが、それは新しい質問に入れるのが一番です。 – stwissel

関連する問題