针对catch错误触发多个动作

Ada*_*uro 3 redux-observable

我正在努力找出如何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))
    )
Run Code Online (Sandbox Code Playgroud)

谁能指导我如何获得catch回报或解雇两个可观察到的行动,这些行动将与我取得成功的方式相似地派遣出去?

jay*_*lps 5

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))
    )
Run Code Online (Sandbox Code Playgroud)

这将是更加惯用的RxJS(因此可以观察到Redux),但这不是必需的。