2016-05-23 6 views
2

Ich verstehe die Kernkonzepte der Observable Datendienste, aber bekomme Probleme, wenn ich ein bisschen robuster Service brauche.Angular 2 Observable HTTP-Dienst Fehlerbehandlung

Für eine Benutzerabfrage muss ich eine Kette von http-Aufrufen machen, so dass das Benutzerobjekt zuerst abgefragt wird und dann nach dem Ergreifen des Benutzerobjekts zusätzliche Daten abgefragt werden. Da diese zusätzlichen Anrufe von dem gegriffenen Benutzerobjekt abhängen. Bei Abonnenten, die das gesamte Benutzerobjekt mit zusätzlichen Daten erhielten, konnte es greifen.

Ich verwende derzeit userSource.mergeMap(user => extraDataNeeded(user)), um die kombinierten Observables zurückzugeben. Dabei gibt extraDataNeededObservable.forkJoin(...OBSERVABLES) OBSERVABLES zurück, ein Array von http-Aufrufen, die zusätzliche Daten zum Benutzerobjekt hinzufügen.

Mein Problem ist, dass, wenn einer dieser zusätzlichen http Anrufe fehlschlägt, der Rest in der Kette abgebrochen werden. Ich möchte für die höchste Observable erstellt von userSource.mergeMap(user => extraDataNeeded(user)), um alle HTTP-Aufrufe unabhängig davon, ob eine fehlschlägt. Ich möchte, dass die Abonnenten von userSource.mergeMap(user => extraDataNeeded(user)) das Benutzerobjekt mit allen Daten empfangen, die es abrufen konnte, und alle Fehler für die internen HTTP-Aufrufe, die fehlgeschlagen sind. Und scheitern vollständig ohne Erfolg Antwort, wenn das Original userSource fehlschlägt.

Antwort

2

Sie können einen catch Block zu jedem Ihrer OBSERVABLES hinzufügen, so dass eine Fehlerantwort einfach einen Fehlertext im next Block zurückgibt.

dh

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); 

Dann, wenn Ihr Objekt bauen würden Sie nur angemessen, diese Fehler umgehen müssen:

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); 
    } 
}); 

Fehler aus dem userSourceObservable noch an die Fehlerbehandlungsroutine übergeben werden und umgehen die forkJoin vollständig.