2017-09-15 3 views
1

Ich habe gerade gelernt, nicht zu nisten abonniert, so stattdessen verwende ich switchMapTo als Mittel jeder aufeinanderfolgenden Stufe auf die Vollendung des vorherigen Schritt beginnen:RXJS - Fehler in der Kette von Observablen Umgang

z.B.

const s1$ = this.retrieveAnnualLeaveVariables();  
    const s2$ = s1$.switchMapTo(this.initialise());  
    const s3$ = s2$.switchMapTo(this.retrieveData()); 
    const s4$ = s3$.switchMapTo(this.accumulateAnnualLeaveRecords()); 
    s4$.subscribe(() => outerStream.next(someResults)) // pass the results to the outerStream 

Was ich jetzt unklar bin, ist, wie Fehler zu integrieren in prägnanter Weise der Handhabung, so dass ich ein Fehlersignal zu outerStream im Fall eines Problems senden kann, begegnete eine beliebige Stelle innerhalb der Kette.

Ich habe versucht, die folgenden mit dem ersten

.catch(e => { 
     return Observable.of<any>([]); 
    }); 

Befestigung jedoch:

  • sollte ich anfügen, dies zu jeder switchMapTo? oder kann ich es an einem Ort verwalten?

  • Welchen Zweck gibt zurück Observable.of ([]); serve - rufe ich die Fehler-Methode auf meinem outerStream von hier?

  • Ich habe nicht herausgefunden, wie man die Kette von Ereignissen stoppt, sobald man einen Fehler wirft - wie mache ich das?

Vielen Dank für Ihre Hilfe!

+0

Ich schrieb eine Antwort, aber ich habe eine weitere Frage für Sie. Woher bekommen Sie die 'someResults' und was kehren die Funktionen in den' switchMapTo' Operatoren zurück? – M4R1KU

Antwort

1

Zuerst sollten Sie die Operatoren auf Ihre Observable verketten, anstatt jedes Mal eine neue Konstante zu erstellen, wenn Sie switchMapTo aufrufen. Dann bekommst du das.

this.retrieveAnnualLeaveVariables() 
    .switchMapTo(this.initialise()) 
    .switchMapTo(this.retrieveData()) 
    .switchMapTo(this.accumulateAnnualLeaveRecords()) 
    .subscribe(() => outerStream.next(someResults)) 

Dann, wenn Sie diese haben, können Sie die catch vor der Zeichnung hinzufügen. In der catch können Sie entweder einen neuen "Fallback" -Wert als beobachtbar, einen leeren Observable zurückgeben oder einen anderen Fehler werfen.

Wenn Sie die Kette anhalten möchten, sollten Sie eine leere Observable über Observable.empty() zurückgeben. Wenn Sie dies zurückgeben, wird das Observable abgeschlossen, ohne die angegebene Subskriptionsfunktion aufzurufen.

Ergebnis:

this.retrieveAnnualLeaveVariables() 
    .switchMapTo(this.initialise()) 
    .switchMapTo(this.retrieveData()) 
    .switchMapTo(this.accumulateAnnualLeaveRecords()) 
    .catch(() => Observable.empty()) 
    .subscribe(() => outerStream.next(someResults)) 
+0

Danke @ M4R1KU - sehr geschätzt! Ich werde das jetzt ausprobieren und die Post aktualisieren. –

+0

Ich habe Ihren Vorschlag zur Vermeidung mehrerer Konstanten angenommen - danke. Ich habe dies getestet, und es scheint mir, dass SwitchMapTo nicht auf die Fertigstellung seines Vorgängers warten, während SwitchMap tut - ich brauche den Code, um einen Schritt auszuführen, abzuschließen, und dann weiter zum nächsten Schritt, so Ich denke, dass ich switchMap Ich habe Erfolg mit der Fehlerberichterstattung haben - danke. Sehr geschätzt Ihre Zeit zu antworten. –

Verwandte Themen