2016-08-03 28 views
1

Ich bin neu in RxJs und Angular2, und ich versuche, Fehler richtig zu behandeln. Ich habe einige Beispiele mit Observables gesehen, die onNext-, onError- und onCompleted-Ereignisse haben (zB here, aber alle Angular2 http-Beispiele, die ich sehe, scheinen nur .catch- und .map-Methoden zu verwenden, und ich bin mir nicht sicher, wie das aussieht . zum OnNext/OnError/OnCompleted Modell arbeite ich mit dem Code von here):Kann die RxJs-Verkettung für Angular2-Http-Antworten konditioniert werden?

let stream = this.http.request(options.url, options) 
    .catch(error: any) => { 
     this.errorsSubject.next(error); 
     return Observable.throw(error); 
    }) 
    .map(this.unwrapHttpValue) 
    .catch((error: any) => { 
      return Observable.throw(this.unwrapHttpError(error)); 
    }); 

ich wollte zunächst machen es einfach so, dass die erste .catch und die .map sind entweder/oder? (dh die .map läuft nur, wenn die http-Anfrage erfolgreich ist), aber ich bin mir nicht sicher, ob das überhaupt möglich ist, und dann wurde es noch komplizierter, indem ich den Beitrag here lese, wo es so aussieht, als würden sie das per this fix sagen, Die Kartenmethode wird automatisch übersprungen, wenn der HTTP-Code < 200 oder> 300 ... ist? Dies ist jedoch nicht, was ich in der Praxis mit eckigen 2.0.0-rc.4 ...

beobachten. Vielen Dank für jegliche Hilfe!

Antwort

0

Denken Sie an catch ist wie typisch try und catch Code. Für eine Observable werden alle Operationen in der Reihenfolge ausgeführt, als wären sie in einem try Block. Wenn ein Fehler auftritt, springt die Verarbeitung auf die erste catch.

Also, wenn Sie nur die map auf Erfolg ausführen möchten, dann legen Sie sie einfach in vor die catch:

let stream = this.http.request(options.url, options) 
    .map(this.unwrapHttpValue) 
    .catch(error: any) => { 
     this.errorsSubject.next(error); 
     return Observable.throw(error); 
    });