Выполнение нескольких действий при обнаружении ошибки

Я изо всех сил пытаюсь понять, как запускать несколько действий в обработчике ошибок catch в моих эпиках.

Я успешно понял, как запускать несколько действий при успешном асинхронном вызове в своих эпиках с помощью thunk-middleware. Смотри ниже:

const editDomainsEpic = (action$) =>
  action$
    .ofType(EDIT_DOMAINS)
    .mergeMap((action) =>
      Rx.Observable.fromPromise(api.editDomains(action.payload))
        // Here we are using Redux thunk middleware to execute
        // a function instead of just dispatching an action
        // so that we can disptach two actions
        // ----------------- vvv
        .map((domain) => (dispatch) => {
          // Display Growl Notifications
          dispatch(
            displayGrowlNotification(
              MESSAGE_TYPES.SUCCESS,
              `${domain.name} was saved`
            )
          )
          // Fire Success Action
          dispatch({
            type: EDIT_DOMAINS_SUCCESS,
            payload: { domain }
          })
        })
        .catch((error) => Rx.Observable.of({
          type: EDIT_DOMAINS_ERROR,
          payload: { error }
        }))
        .takeUntil(action$.ofType(EDIT_DOMAINS_CANCEL))
    )

Может ли кто-нибудь указать мне, как я могу вернуть catch или запустить два наблюдаемых действия, которые будут отправлены так же, как я сделал с успехом?


person Adam Duro    schedule 21.02.2017    source источник


Ответы (1)


Observable.of() поддерживает произвольное количество аргументов и будет генерировать их все последовательно один за другим, поэтому, чтобы генерировать более одного действия в вашем catch, вы просто добавляете больше аргументов.

Имея эти знания под рукой, вы также можете использовать их для отправки нескольких действий для достижения успеха вместо того, чтобы посылать сигнал и принудительно вызывать отправку самостоятельно.

const editDomainsEpic = (action$) =>
  action$
    .ofType(EDIT_DOMAINS)
    .mergeMap((action) =>
      Rx.Observable.fromPromise(api.editDomains(action.payload))
        .mergeMap((domain) => Rx.Observable.of(
          displayGrowlNotification(
            MESSAGE_TYPES.SUCCESS,
            `${domain.name} was saved`
          ), {
            type: EDIT_DOMAINS_SUCCESS,
            payload: { domain }
          }
        ))
        .catch((error) => Rx.Observable.of({
          type: EDIT_DOMAINS_ERROR,
          payload: { error }
        }, {
          type: ANOTHER_ONE,
          payload: 'something-else'
        }))
        .takeUntil(action$.ofType(EDIT_DOMAINS_CANCEL))
    )

Это было бы более идиоматично RxJS (и, следовательно, наблюдаемым с редуксом), но это не обязательно требование.

person jayphelps    schedule 21.02.2017
comment
Потрясающий! Спасибо! Я все еще немного новичок в RxJS, поэтому изучение этих идомов здорово - person Adam Duro; 21.02.2017