我可以使用';以';在redux传奇中等待进展?当作为这样使用时,传奇流跳回到传奇中的早期点

我可以使用';以';在redux传奇中等待进展?当作为这样使用时,传奇流跳回到传奇中的早期点,redux,react-redux,redux-saga,redux-api-middleware,Redux,React Redux,Redux Saga,Redux Api Middleware,我使用reduxapi中间件进行api调用,使用reduxagas进行副作用处理。对于特定的表单流,用户可以进行两种不同的更改,这需要由单独的API来处理。如果我们其中一个失败了,整个故事都会失败。我有一个处理失败的独立传奇。 在某些情况下,这会中断。当我们查看开发人员工具时,这个故事似乎运行了两次,在再次运行这些步骤之前跳到初始点。我已将此标记为注释。触发saga的操作只运行一次(在redux开发工具中验证) 这是模拟代码- 行动- function changesAApi() { ret

我使用reduxapi中间件进行api调用,使用reduxagas进行副作用处理。对于特定的表单流,用户可以进行两种不同的更改,这需要由单独的API来处理。如果我们其中一个失败了,整个故事都会失败。我有一个处理失败的独立传奇。 在某些情况下,这会中断。当我们查看开发人员工具时,这个故事似乎运行了两次,在再次运行这些步骤之前跳到初始点。我已将此标记为注释。触发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');
  });
}

这是创建此流的正确方法吗?有更好的方法吗

老实说,我会用一种完全不同的方式来构建它。在我看来,问题在于工具太多。简单的解决方案是使用其中一种。就我个人而言,我喜欢在所有API调用中使用sagas,因为它们使我能够更好地控制API的使用方式

sagas文档提供了一个sagas如何工作的基本示例。这是一个非常棒的教程,可以快速启动和运行,但我发现,一旦我了解了这一点,传奇故事的局限性就会大大降低

以这种方式编写sagas可以让您以更优雅的方式处理异步状态更改,并大大提高代码的可读性

这是我整理的一个小片段,说明了解决您的问题的一个可能的解决方案:

//从组件分派
const getUsers=()=>dispatch({type:'GET_USERS'})
函数*watchGetUsers(){
while(true){
试一试{
收益率(获取用户)
产生put({type:'REQUEST/GET_USERS'})
常量数据=收益调用(methodThatCallsAPI,args)
//副作用的东西
产生put({type:'SUCCESS/GET_USERS',负载:data})
//redux reducer处理不断变化的状态
}捕捉(错误){
产生put({type:'FAILURE/GET_USERS',负载:err})
//州内的redux减速器
//还可以使用put将逻辑传递给错误传奇吗
}
}
}
您还可以使用sagas阻止任何并发请求或取消未完成的请求。这是另一个可以让你的传奇故事成功的例子:

//将传奇故事放入对象中
常数apiSagas={
“获取用户”:watchGetusers,
//其他传奇
}
函数*consumeApiRequestsBlocking(){
while(true){
//分派({type:'API_-REQUEST',负载:{type:GET_-USERS}})
const request=yield take('API\u request')
收益调用(apiSagas[request.type])
//在上述行完成之前,无法发送“API_请求”
//因为调用是阻塞的;fork是非阻塞的
//注意:您应该从中删除收益率(“获取用户”)
//本例中的watchgetUsers
}
}
祝你好运