Ich möchte einen Fehler von meiner beobachtbar ist werfen Karte Betreiber auf der Grundlage einer Bedingung. Zum Beispiel, wenn keine korrekten API-Daten empfangen werden. Bitte beachten Sie den folgenden Code:
private userAuthenticate( email: string, password: string ) {
return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password})
.map( res => {
if ( res.bearerToken ) {
return this.saveJwt(res.bearerToken);
} else {
// THIS DOESN'T THROW ERROR --------------------
return Observable.throw('Valid token not returned');
}
})
.catch( err => Observable.throw(this.logError(err) )
.finally( () => console.log("Authentication done.") );
}
Grundsätzlich möchte ich, wie Sie im Code sehen können, einen Fehler auslösen, wenn die Antwort (res-Objekt) kein 'bearerToken' enthält. Damit geht es in meinem Abonnement in den unten genannten 2. Parameter (handleError).
.subscribe(success, handleError)
Irgendwelche Vorschläge?
angular
typescript
rxjs
Hassan
quelle
quelle
throw 'Valid token not returned';
?return throw 'message here'
, aber ohne dasreturn
Schlüsselwort. Lassen Sie mich überprüfen, ob es logisch richtig funktioniert.subscribe
Methode nicht empfangen und.finally()
der Stream wird ebenfalls ausgelöst. (Allerdings wird die Hinrichtung gestoppt, was eine gute Sache ist)Antworten:
Wirf den Fehler einfach in den
map()
Operator. Alle Rückrufe in RxJS werden mit Try-Catch-Blöcken umschlossen, damit sie abgefangen und dann alserror
Benachrichtigung gesendet werden .Dies bedeutet, dass Sie nichts zurückgeben und nur den Fehler auslösen:
Das
throwError()
(früherObservable.throw()
in RxJS 5) ist ein Observable, das nur eineerror
Benachrichtigung sendet , sichmap()
aber nicht darum kümmert, was Sie zurückgeben. Selbst wenn Sie ein Observable zurückgebenmap()
, wird es alsnext
Benachrichtigung übergeben.Als letztes müssen Sie wahrscheinlich nicht verwenden
.catchError()
(frühercatch()
in RxJS 5). Wenn Sie im Falle eines Fehlers Nebenwirkungen ausführen müssen, ist es beispielsweise besser, diese zu verwendentap(null, err => console.log(err))
(früherdo()
in RxJS 5).Jan 2019: Aktualisiert für RxJS 6
quelle
return
das Fehlerobjekt daraus ziehen und jetzt funktioniert es perfekt :) Danke!catch()
nur zum Protokollieren und erneuten Auslösen des Fehlers verwendet wurde, was unnötig ist, wenn Sie nur einen Nebeneffekt ausführen möchten (Protokollieren des Fehlers) und es einfacher ist, nurdo()
return throwError(new Error('Valid token not returned'));
?return throwError()
gibt ein zurückObservable<never>
, dies unterbricht den beobachtbaren Strom sofort, ohne überhaupt zurückzukehren.Wenn Sie das Gefühl haben
throw new Error()
, nicht beobachtbar zu sein, können Sie Folgendes verwendenswitchMap
:oder genauer:
Das Verhalten wird das gleiche sein, es ist nur eine andere Syntax.
Sie sagen wörtlich "Wechsel" von der in der Pipe beobachtbaren http zu einer anderen beobachtbaren, die entweder nur den Ausgabewert "umschließt", oder eine neue beobachtbare "Fehler".
Vergiss nicht zu setzen
of
, sonst erhalten Sie verwirrende Fehlermeldungen.Das Schöne an 'switchMap' ist auch, dass Sie eine ganz neue 'Befehlskette' zurückgeben können, wenn Sie möchten - für welche Logik auch immer
saveJwt
.quelle
switchMap
eine asynchroneif
Aussage zu denken, machten die Dinge viel mehr Sinn :-)Obwohl diese Frage bereits beantwortet ist, möchte ich meinen eigenen Ansatz teilen (auch wenn er sich nur geringfügig von oben unterscheidet).
Ich würde entscheiden, was getrennt von der Zuordnung zurückgegeben wird und umgekehrt. Ich bin mir nicht sicher, welcher Operator dafür am besten geeignet ist, also werde ich ihn verwenden
tap
.quelle
tap
wird ignoriert. Dieser Code macht etwas anderes als es sagtthrow new Error()
die beste Option bisher ist