我使用 redux-api-middleware 进行 api 调用,使用 redux-sagas 进行副作用。对于特定的表单流,用户可以进行 2 种不同的更改,这些更改需要由单独的 api 处理。如果我们其中一个失败了,整个传奇就应该失败。我有一个单独的传奇来处理失败。在某些情况下,这会中断。当我们查看开发人员工具时,saga 似乎运行了两次,跳到初始点,然后再次运行这些步骤。我已将此标记为评论。触发 saga 的动作只运行一次(在 redux 开发工具中验证)
这是模拟代码 -
行动 -
function changesAApi() {
return (dispatch, getState) => {
dispatch({
[CALL_API]: {
types: ['changes-A', 'changes-A-success','changes-A-failure'],
endpoint: '/changesA',
method: 'post',
}
})
}
}
// can be called individually, but state in A affects this call
function changesBApi() {
return (dispatch, getState) => {
dispatch({
[CALL_API]: {
types: ['changes-B', 'changes-B-success','changes-B-failure'],
endpoint: '/changesB',
method: 'post',
}
})
}
}
萨迦 -
function* saveFormChanges(action) {
// point (1)
if (action.changesA) {
yield put(changesAApi());
// jumps to point (1) the first time
yield take('changes-A-success');
// point (2)
}
if (action.changesB) {
yield put(changesBApi());
// jumps to point (2)
yield take('changes-B-success');
// point (3)
}
// jumps to point (3)
yield call(displaySuccessMessage);
}
function* errorSaga() {
yield takeLatest(action => /failure$/.test(action.type), () => {
alert('failure');
});
}
这是创建此流程的正确方法吗?有一个更好的方法吗?