Rxjs:“throw”语句没有被piped catchError处理

时间:2018-05-25 15:44:22

标签: rxjs ngrx ngrx-effects

“authenticationService”提供以下身份验证方法。我无法输入管道catchError。我错过了什么?

authenticate(credentials: { username: string; password: string }){

   return new Observable<any>((observer: Observer<any>) => {

    // ... calling the service, obtaining a promise
    const authenticationPromise = ... ;

    // This is a promise, it must be converted to an Observable
    authenticationPromise
        .then(() => {
          observer.next('ok');
          observer.complete();
        })
        .catch(err => {
          console.log('service error ' + err);
          throw new Error('crap');
        });
    });
  }

设置所有ngrx&amp;除了ngrx /效果部分,根据用户请求调用此身份验证方法:

(redux stuff).(({ payload }: actions.LoginRequestAction) =>
    context.authService.authenticate(payload)
    .pipe(
      map(() => new GenericSuccessAction(...))
      // Even though a throw statement happened in the authenticate method, this is never reached:
      catchError((err: Error) => {
        console.log('[debug] error caught: ', err);
        return of(new actions.LoginFailureAction());
      }),
    )
  )

1 个答案:

答案 0 :(得分:1)

  

如上所述here,catchError用于:

     

优雅地处理可观察序列中的错误。

首先,您基本上是通过捕获承诺中的错误来处理您的承诺中的错误。抛出promise中的错误并不会返回发出错误的observable。

你可以:

  1. 将您的承诺转换为可观察的承诺,并且根本不使用.catch
  2. 使用rxjs&#39;将错误作为可观察对象返回。 throwError(err)
  3. 无论哪种方式,你创建observable的方式都值得怀疑。

    这是处理rxjs中承诺的更好,更简洁的方法:

    from(authenticationPromise)
        .pipe(
             map(() => 'ok')
        )