订阅Observable之前处理错误

时间:2020-04-04 16:57:54

标签: angular rxjs

如何正确处理下一个函数中的错误?

          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;
  }

当前,我遇到一个错误:

在期望流的位置提供“未定义”

我做错了什么?感谢您的提前帮助。

3 个答案:

答案 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,
        }
    }