ngrx - обработка ошибок в редукторе и эффекте

Поэкспериментируйте с использованием ngrx с модулем эффектов. Я отправляю действие, выполняю некоторые асинхронные операции с помощью эффекта, затем отправляю новое действие для обновления состояния, а затем перенаправляю. Вот урезанная версия того, что я делаю:

@Injectable()
export class Effects {

  @Effect()
  start$: Observable<Action> = this.actions$
    .ofType('start')
    // omitted for brevity
    .concatMap(action => [
      new finishAction(action.payload),
      go(['/'])
    ])
    .catch((err) => {
      console.log('err', err);
      return Observable.empty();
    })

  constructor(private actions$: Actions) {
  }
}

Все это работает нормально - когда я отправляю действие start, этот эффект срабатывает, отправляет действие finish, затем перенаправляет обратно в корень (через действие go, которое импортируется из @ngrx/router-store.

Как мне справиться с ошибкой в ​​finishAction? В данный момент я получаю сообщение об ошибке в консоли, а затем go запускается независимо.

В идеале я хотел бы перехватить этот сбой и отправить другое действие (чтобы я мог показать модальное окно или что-то в этом роде, но не выполнять перенаправление)


person royse41    schedule 27.04.2017    source источник
comment
Обратите внимание, что при обнаружении ошибок подходом, который вы используете во фрагменте, ваш наблюдаемый эффект будет завершен, и после ошибки не будут обрабатываться никакие действия. См. stackoverflow.com/a/41685689/6680611   -  person cartant    schedule 28.04.2017


Ответы (1)


Если редюсер finishAction завершает процесс неудачно, состояние действия должно быть изменено на состояние ошибки.

Вы можете подписаться на Effects.start $ в своем компоненте и выбрать состояние ошибки. Если подписка получает сообщение об ошибке, вы можете отреагировать, перейдя на новый маршрут.

person Julia Passynkova    schedule 27.04.2017
comment
Спасибо за ответ. но этого не происходит - если в коде, который я опубликовал выше, возникает ошибка finishAction, действие go все равно выполняется - person royse41; 27.04.2017
comment
вы можете переместить код go в Effects.start $ .withLatestFrom (state) .subscribe (x = ›if (x == 'good result') go ('/ good) else go (/ bad)}) - person Julia Passynkova; 27.04.2017