Rxjs: оператор «throw» не обрабатывается piped catchError - PullRequest
0 голосов
/ 25 мая 2018

Служба аутентификации предоставляет следующий метод аутентификации.Я не могу войти в переадресацию.Чего мне не хватает?

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 Ответ

0 голосов
/ 25 мая 2018

Как указано здесь , catchError используется для:

Изящно обрабатывать ошибки в наблюдаемой последовательности.

Прежде всего, выв основном обрабатывает ошибку в вашем обещании, улавливая ошибку в вашем обещании.Выдача ошибки в обещании не возвращает наблюдаемое, которое выдает ошибку.

Вы можете:

  1. Конвертировать свое обещание в наблюдаемое и не использовать .catch вall.
  2. Возвратите ошибку как наблюдаемую с помощью rxjs 'throwError(err)

В любом случае, способ создания вашей наблюдаемой сомнителен.

Этогораздо лучший и краткий способ выполнения обещаний в rxjs:

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