2016-05-23 36 views
2

私はObservableデータサービスのコア概念を理解していますが、もう少し堅牢なサービスが必要なときには問題に遭遇しています。角度2観測可能なHTTPサービスのエラー処理

ユーザークエリでは、ユーザーオブジェクトを最初に照会し、ユーザーオブジェクトを取得した後で追加データを照会するような一連のhttp呼び出しを行う必要があります。これらの余分な呼び出しは、グラブされたユーザオブジェクトに依存するためです。加入者は余分なデータでユーザーオブジェクト全体を受け取るため、取得することができました。

私は現在、Observablesを返すためにuserSource.mergeMap(user => extraDataNeeded(user))を使用しています。 がObservable.forkJoin(...OBSERVABLES)を返します。 OBSERVABLESは、ユーザーオブジェクトに余分なデータを追加するhttp呼び出しの配列です。

私の問題は、これらの余分なhttp呼び出しの1つが失敗すると、チェーン内の残りの部分がキャンセルされることです。 1つでも失敗した場合でも、すべてのhttpコールを無関係にするために、userSource.mergeMap(user => extraDataNeeded(user))から作成された最高のオーダーを観測可能にしたいと思います。 userSource.mergeMap(user => extraDataNeeded(user))のユーザは、取得できたデータでユーザオブジェクトを受信し、内側のhttpコールが失敗した場合はエラーを受け取るようにしたいと思います。元のuserSourceが失敗した場合、成功応答なしで完全に失敗します。

答えて

2

OBSERVABLESそれぞれにcatchブロックを追加して、エラー応答が単にnextブロックにエラー応答を返すようにすることができます。あなたのオブジェクトを構築するとき

すなわち

source1.catch(e => Rx.Observable.of({error: e})); 
source2.catch(e => Rx.Observable.of({error: e})); 

//or made modular 

function handler(e) { return Rx.Observable.of({error: e})); 

var safeSource1 = source1.let(handler); 
var safeSource2 = source2.let(handler); 

は、次に、あなただけの適切なこれらのエラーを処理する必要があります:userSourceObservableから

Rx.Observable.forkJoin(safeSource1, safeSource2, sources => { 
    //Totally made up 
    var combined = {components: [], errors: []}; 
    for (let resp of sources) { 
    if (resp.error) 
     combined.errors.push(resp.error); 
    else 
     combined.components.push(resp); 
    } 
}); 

エラーがまだエラーハンドラに渡されると、バイパスforkJoin

関連する問題