Wie behandeln Fehler in einem Resolver
Ich versuche, Resolver, um eine bessere UX. Funktioniert alles Super auf den happy path. Was kann ich nicht scheinen, um herauszufinden, ist, wie die Behandlung von Ausnahmen. Mein resolver einen Dienst aufruft, und das trifft ein webapi-Projekt. Ein Beispiel:
FooResolver:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Foo> {
return this.fooService.getById(route.params['id']).catch(err => {
****not sure what to do/return in the case of a server error****
return Observable.throw(err);
});
}
FooService:
public getById(id: string): Observable<Foo> {
return this.http.get(`${ this.apiUrl }/${ id }`)
.map(this.extractData)
.catch(this.handleError);
}
Die handleError-Funktion:
protected handleError (error: Response | any) {
//Todo: Log the error
//Errors will be handled uniquely by the component that triggered them
return Observable.throw(error);
}
Innerhalb der FooComponent ich tun (dies ist nie der hit, die im Falle eines Fehlers zurückgegeben, die von der Dienst - /resolver):
FooComponent:
ngOnInit(): void {
this.foo= this.route.snapshot.data['foo'];
if (this.foo) {
this.createForm(this.foo);
}
}
Habe ich versucht, wirft den Fehler (wie gezeigt) - ich bekomme diese exception in der Konsole:
Nicht erfasste (bei Versprechen): Antwort mit status: 500 Internal Server Error
URL:
und die Rückkehr new Observable<Foo>()
, die gibt es:
Cannot read property 'abonnieren' undefined
Habe ich ein paar Resolver, die alle erleben können Ausnahmen auf dem server, Aber ich weiß nicht, was zu tun ist im Falle dieser Ausnahmen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel einer meiner Resolver mit Fehlerbehandlung, mit der Technik, dass Gunter schon sagt:
Finden Sie das komplette Beispiel hier: https://github.com/DeborahK/Angular-Routing in der APM-final Ordner.
UPDATE Feb 2019
Hier ist eine bessere Antwort für die Fehlerbehandlung in einem resolver:
1) Wickeln Sie Ihre Schnittstelle in eine andere Schnittstelle mit einer optionalen error-Eigenschaft:
2) zu beschließen, dass-Schnittstelle:
3) In der Komponente, ziehen Sie das Stück von der Schnittstelle, die Sie brauchen:
Observable.throw(theError);
anstelle von nullSie brauchen, um wieder eine beobachtbare Abschluss mit
false