将基于redux-thunk构建的大型代码库移至redux-observable,并努力找出史诗般的语义:
这是到目前为止我得到的:
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
答案 0 :(得分:1)
我认为问题在于,第一个.map应该改为.switchMap,.concatMap或.mergeMap。为了验证这一点,请在成功案例中添加一条日志语句,以查看result
等于什么,我希望您会看到这是一个承诺,而不是该承诺所解决的价值。此外,诺言将处于待定状态;尚未解决/拒绝。
如果在第一个可以完成之前快速连续启动多个LOAD_ACTION,则选择switch vs concat vs merge取决于您要执行的操作。 Switch将取消第一个以支持新的; concat将等待第一个完成,然后再继续第二个;合并将以可能的顺序进行操作,但不保证结果的顺序。