代码之家  ›  专栏  ›  技术社区  ›  Danny Delott

使用redux observate执行XHR然后调度成功/失败

  •  1
  • Danny Delott  · 技术社区  · 7 年前

    将一个基于redux的大型代码库移到redux observate,我正在努力找出史诗的语义,它将:

    1. 听负载动作
    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调用成功时,这种方法就可以正常工作,但是如果承诺因错误而被拒绝,则 catch 操作永远不会被调用。

    有人能给我指个正确的方向吗?我们正在使用:

    • redux-observable@0.18.0
    • rxjs@5.5.11
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nicholas Tower    7 年前

    我认为问题在于,第一个.map应该改为.switchMap、.concatMap或.mergeMap。为了验证这一点,在success案例中粘贴一条log语句来查看 result 等于,我希望你会看到这是一个承诺,而不是承诺的价值。此外,承诺将处于待定状态;尚未解决/拒绝。

    选择switch vs concat vs merge将取决于在第一个加载操作完成之前,如果快速连续启动多个加载操作,您想做什么。Switch将取消第一个,而改为新的;concat将等待第一个完成,然后再转到第二个;merge将按其所能的顺序执行这些操作,但不保证结果的顺序。