如何正确处理下一个函数中的错误?
this.userService.getUser(uid)
.pipe(
catchError(err => {
this.router.navigate(['/sign-up']);
})
)
.subscribe(user => {
if (user) {
this.store.dispatch(new UserActions.LoggedIn());
this.router.navigate(['/']);
}
})
public getUser(uid: string): Observable<User> {
const source = this.baseApolloService.query<{ uid: string }, User>(getUserQuery, (data) => data.getUser, { uid });
return source;
}
当前,我遇到一个错误:
在期望流的位置提供“未定义”
我做错了什么?感谢您的提前帮助。
答案 0 :(得分:1)
我认为catchError
期望有一个observable
流,它说在subscribe
非错误路径出错的情况下我应该返回什么。对于您的情况,我将在subscribe
中进行此错误处理。
this.userService.getUser(uid)
.subscribe(user => {
if (user) {
this.store.dispatch(new UserActions.LoggedIn());
this.router.navigate(['/']);
}
}, (error) => {
console.log(error);
this.router.navigate(['/sign-up']);
})
Rxjs catchError
需要流和文档:https://www.learnrxjs.io/learn-rxjs/operators/error_handling/catch
========================编辑===================== =====
我看到您想在订阅之前处理错误,然后是的,您必须为subscribe
提供一个流,但是if
内部的条件将不会运行,因为我们将返回{{1 }}。
尝试:
null
我认为两种方法都很好。
答案 1 :(得分:1)
catchError
必须返回流。这是为了处理错误并返回default value
。
catchError((err) => {
this.router.navigate(["/sign-up"]);
// return something
// of({data: "something"})
});
对于您而言,您可以在结尾处捕获错误:
this.userService.getUser(uid).subscribe(
(user) => {
if (user) {
this.store.dispatch(new UserActions.LoggedIn());
this.router.navigate(["/"]);
}
},
(error) => {
console.log(error);
this.router.navigate(["/sign-up"]);
}
);
更多:https://rxjs-dev.firebaseapp.com/api/operators/catchError
答案 2 :(得分:0)
这会帮助你。
this.userService.getUser(uid)
.pipe(catchError(err => {
this.handleError(err);
return of<any>({ isSuccess: false, error: err });
}).subscribe(user => {
//your code
})
如果发生错误,则catchError逻辑将开始执行。catchError运算符将处理错误并将其传递给错误处理函数。 catchError只是一个接收输入Observable并输出Output Observable的函数,该函数将返回一个Observable,它将替换刚刚出错的流的Observable。错误处理功能如下。
private handleError(error: HttpErrorResponse): void {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
}
}