使用redux-observable执行XHR,然后分派成功/失败

时间:2018-08-10 00:32:30

标签: reactjs redux rxjs redux-observable

将基于redux-thunk构建的大型代码库移至redux-observable,并努力找出史诗般的语义:

  1. 听LOAD动作
  2. 执行XHR
  3. 发送适当的“成功”或“失败”操作

这是到目前为止我得到的:

export function editEpic(action$, unusedStore, { xhrClient }) {
  return action$
    .ofType(LOAD_ACTION)
    .map(({ apiParams, operationId }) => {
      // xhrClient is an object with methods on it that
      // return a Promise of the data
      const editOperation = xhrClient[operationId];

      // call the api now
      return editOperation(apiParams);
    })
    .map(result => {
      return { type: SUCCESS_ACTION, result };
    })
    .catch(error => {
      // We never get here..
      return { type: FAILURE_ACTION, error };
    });
}

当API调用成功时,这很好用,但是如果Promise拒绝并出现错误,则永远不会调用catch操作。

有人可以在这里指出正确的方向吗?我们正在使用:

  • redux-observable@0.18.0
  • rxjs@5.5.11

1 个答案:

答案 0 :(得分:1)

我认为问题在于,第一个.map应该改为.switchMap,.concatMap或.mergeMap。为了验证这一点,请在成功案例中添加一条日志语句,以查看result等于什么,我希望您会看到这是一个承诺,而不是该承诺所解决的价值。此外,诺言将处于待定状态;尚未解决/拒绝。

如果在第一个可以完成之前快速连续启动多个LOAD_ACTION,则选择switch vs concat vs merge取决于您要执行的操作。 Switch将取消第一个以支持新的; concat将等待第一个完成,然后再继续第二个;合并将以可能的顺序进行操作,但不保证结果的顺序。