Wie zu propagieren und Fehler durch catchError() richtig?
Ich schrieb eine Funktion, die pipe
-Lage:
HandleHttpBasicError<T>()
{
return ((source:Observable<T>) => {
return source.pipe(
catchError((err:any) => {
let msg = '';
if(err && err instanceof HttpErrorResponse)
{
if(err.status == 0)
msg += "The server didn't respond";
}
throw {
err,
msg
} as CustomError
})
)
})
}
Kann ich diese Funktion verwenden, auf diese Weise in meine HttpService
:
checkExist(id:string)
{
return this.http.head<void>(environment.apiUrl + 'some_url/' + id)
.pipe(
HandleHttpBasicError(),
catchError((err:CustomError) => {
if(err.msg)
throw err.msg;
if(err.err.status == HttpStatusCodes.NOT_FOUND)
throw("It doesn't exist.");
throw(err);
})
)
}
Ist es großartig. Wenn ich abonnieren checkExist()
, bekomme ich ein gutes Fehlermeldung, weil HandleHttpBasicError
ersten Fänge ein Fehler auf und wirft es der service catchError()
, die throwes die Fehlermeldung, da war es nicht null
.
Diese Weise erlaubt es mir, einen globalen catchError()
mit Fehlermeldungen wird immer der gleiche sein. In Zukunft werde ich es tun, in eine HttpHandler
, aber das ist nicht der Punkt hier.
Ist es ok, um die Kette der Fehler mit der throw
keyword?
Ich versuchte wieder Observable.throwError()
, aber der browser sagte
Beobachten.throwError ist nicht eine Funktion
Meine Importe sind import {Observable, of, throwError} from 'rxjs';
.
Ist es nicht besser, dies zu tun:
return ((source:Observable<T>) => {
return source.pipe(
catchError((err:any) => {
msg = '';
...
return of({err, msg} as CustomError)
/* instead of
throw(err)
-or-
return Observable.throwError(err) (which doesn't work)
*/
})
)
})
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist völlig in Ordnung. rxjs try-catches solchen Fällen und wandelt Sie in eine Fehler Meldung.
Mit rxjs6, die
Observable
Prototyp wird nicht mehr geändert, Operatoren enthalten, oder diese »Schöpfung-Operatoren«, statt Sie ausgesetzt sind, als standalone-Funktionen. Lesen Sie mehr über es hier, aber das wesentliche ist, dass Sie würde nurreturn throwError(…)
z.B.