Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 按特定顺序重新执行分派操作_Reactjs_Redux - Fatal编程技术网

Reactjs 按特定顺序重新执行分派操作

Reactjs 按特定顺序重新执行分派操作,reactjs,redux,Reactjs,Redux,之前我问了一个问题,关于如何在采取行动之前强制完成调度,但是我并没有真正解决我的问题 似乎将派遣包装在承诺中没有任何作用,因为一旦派遣完成,承诺将得到解决,而不一定如其中一条评论中所述减少 这是我的密码: export const selectObjectTransition = (transition) => { return dispatch => { dispatch({ type: IS_DONE, isDone: false

之前我问了一个问题,关于如何在采取行动之前强制完成调度,但是我并没有真正解决我的问题

似乎将派遣包装在承诺中没有任何作用,因为一旦派遣完成,承诺将得到解决,而不一定如其中一条评论中所述减少

这是我的密码:

export const selectObjectTransition = (transition) => {
  return dispatch => {
    dispatch({
      type: IS_DONE,
      isDone: false
      })
    dispatch(loadObjectTransitionApprovals(transition.id));  
    dispatch(loadObjectTransitionHooks(transition.id));  
    dispatch({
      type: SELECT_TRANSITION,
      selected_transition: transition,
    });
    dispatch({
      type: IS_DONE,
      isDone: true
      })
    } 
}
基本上,我希望实现的是按照以下顺序执行和完成调度(从顶部到bottm)。现在,它偶尔会中断并以不同的顺序完成调度,导致我的前端出现错误

我的redux开发工具:

IS_DONE -> SELECT_TRANSITION -> IS_DONE -> ......

第二个
已经完成了
操作应该在最后一个执行,除了我上面的评论,你也可以试试这个

export const toDispatch = () =>{
  return dispatch =>{
    axios.get(url).then(()=>{
     dispatch(functionToDispatch())
    })
  }
}
看看它将帮助您编写一个生成器函数,它将帮助您使这些异步流易于读取、写入和测试

以下是一个例子:

函数*fetchUser(操作){
试一试{
//您可以在此处调用您想要分派的操作
产生put({type:“USER\u FETCH\u successed”,USER:USER});
}捕获(e){
产生put({type:“USER\u FETCH\u FAILED”,message:e.message});
}
}
函数*mySaga(){
收益takeEvery(“用户\获取\请求”,获取用户);
}

尝试将它们放在Try-catch块中,并对每个分派调用以异步方式调用操作分派-通常看起来如下:

export const actionName = ({VariablesToPassToTheAction}) => async(dispatch) => {

};
尝试为所有涉及api调用的操作调整此机制。最后把你的东西包在试抓块里。如果发生错误,后续调度将失败并调用catch块,否则将按顺序执行:

export const selectObjectTransition = (transition) => async(dispatch) => {
    try{
dispatch({
      type: IS_DONE,
      isDone: false
      })
    dispatch(loadObjectTransitionApprovals(transition.id));  
    dispatch(loadObjectTransitionHooks(transition.id));  
    dispatch({
      type: SELECT_TRANSITION,
      selected_transition: transition,
    });
    dispatch({
      type: IS_DONE,
      isDone: true
      })
    }

  catch(err){
    //control shifts here if any dispatch fails. Don't forget to handle the error
    }
}

不要同时调用actionsall,希望它们都能立即被调度,而是使用
componentDidUpdate(prevProps)
检查操作是否已调度,reducer是否已更新,然后发送第二个操作,然后执行同样的操作,然后发送第三个操作。有更好的方法吗?因为有时我希望收到一个null或空结果,所以检查我是否收到数据是不可靠的,而是检查操作本身是否完成不是我能想到的,我会在我的reducer中创建另一个字段,如
dataFecthing
,每次调用操作时都调用它,在开始时
dataFetching:true
和收到响应后
false
,它应该可以解决您在
componentdiddupdate
中遇到的问题,因为它会被调用并随时更新道具。