bugfix> rxjs > 投稿

「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とngrx/effectの部分を別にすると、この認証方法はユーザーの要求時に呼び出されます:

(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 件
  • As stated here, catchError is used to:

    Gracefully handle errors in an observable sequence.

    まず、基本的には、promiseのエラーをキャッチすることで、promiseのエラーを処理しています。 promiseでエラーをスローしても、エラーを発生するObservableは返されません。

    あなたはできる:

    約束を観察可能なものに変換し、 .catch を使用しない  まったく。

    エラーをrxjsの throwError(err) でオブザーバブルとして返します

    いずれにせよ、オブザーバブルの作成方法には疑問があります。

    これは、rxjsでpromiseを処理するためのはるかに優れた簡潔な方法です。

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

あなたの答え