NGRX Effects разбивает приложение на ошибки, как обрабатывать ошибки? - PullRequest
0 голосов
/ 29 августа 2018

Я использую эффекты NGRX в своем приложении. Когда это терпит неудачу, это, кажется, прерывает поток.

@Effect()
createUser$: Observable<Action> = _action$.ofType(fromUser.CREATE_NEW_USER_ACTION)
  .pipe(
    mergeMap((action: fromUser.CreateNewUserAction) =>
      this._tokenService.post('users', action.payload)
        .pipe(
          map(response => {
            this._router.navigate(
              ["dashboard", "users", "view"],
              { queryParams: { id: response.json().message.id } });
            return new fromUser.CreateNewUserCompleteAction(response.json().message);
          },
            catchError(error =>
              of(new fromUser.CreateNewUserFailedAction(error.json().message))
            )
          )
        )
    )
  );

Действие ошибки никогда не вызывается, я попытался войти.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Похоже, ваши parentheses не правильно размещены во 2-й pipe функции. map и catchError должны быть в параллельном внутри трубы. В вашем коде функция catchError находится внутри map.

@Effect()
createUser$: Observable<Action> = _action$.ofType(fromUser.CREATE_NEW_USER_ACTION)
  .pipe(
    mergeMap((action: fromUser.CreateNewUserAction) =>
      this._tokenService.post('users', action.payload)
        .pipe(
          map(response => {
            this._router.navigate(
              ["dashboard", "users", "view"],
              { queryParams: { id: response.json().message.id } });
            return new fromUser.CreateNewUserCompleteAction(response.json().message);
          }),
          catchError(error =>
            of(new fromUser.CreateNewUserFailedAction(error.json().message))
          )
        )
    )
  );

Кстати, это хорошая практика размещения catchError с запросом http, а не вставка во внешний поток pipe, который потенциально остановит наблюдаемую action$, и дальнейшие действия не будут быть принятым NGRX Framework.

0 голосов
/ 30 августа 2018

Что возвращает ваш tokenService? Это может быть обработка любых ошибок из вызова API внутри. CatchError должен работать, пока ваш вызов API не скрывает событие ошибки. В этом случае вам может потребоваться выбросить ошибку из этой службы с помощью Observable.throw ().

Обычно я форматирую свои эффекты более для удобства чтения.

@Effect() updateUser$: Observable<Action>;

constructor(action$: Actions, tokenService: TokenService) {
this.updateUser$ = action$.ofType(fromUser.UPDATE_USER_ACTION)
.pipe(
    mergeMap((action: fromUser.UpdateUserAction) => 
        tokenService.patch(`users/${this.user.id}`, action.payload)
           .pipe(
              map(response => {
                 this._router.navigate(
                    ["dashboard", "users", "view"], 
                    { queryParams: { id: response.json().message.id } });
                 return new fromUser.UpdateUserCompleteAction(response.json().message); 
              },
              catchError(error => 
                 of(new fromUser.UpdateUserFailedAction(error.json().message))
              )
           )
        )
    )
);
}

Этот код выглядит так, как будто он должен работать. Взгляните на свой TokenService.

...