Как принудительно отправить redux на fini sh перед выполнением следующего действия? - PullRequest
0 голосов
/ 30 мая 2020

Привет, ребята, я столкнулся с проблемой с redux, кажется, что упаковка ее с помощью обещания не гарантирует, что функции asyn c сначала запустят fini sh. Вот часть моего кода:

apiGet(){               
    // where my dispatch function lives at
    var getstates = this.props.get_states(this.props.match.params.id)
    var gettransitions = this.props.get_transitions(this.props.match.params.id)
    var  workflowclass_fetcher = this.props.get_workflow(this.props.match.params.id)
    Promise.all([getstates, gettransitions , workflowclass_fetcher ]).then(() => {
        this.setState({ done : true });
        console.log(this.props)
    })
}

async componentDidMount(){
    // <---- here i use this await function to ensure that states get cleared first
    await this.props.clearAll()      
    this.apiGet()
}

Затем я проверяю свой метод рендеринга, если done истинно:

return (this.state.done 
    ? //some jsx here
    : <div style={{ textAlign: 'center' }}><Spin size='large' /></div>
)

Я бы подумал, что 3 диспетчерские функции в apiGet будет запускать fini sh сначала перед вызовом setState, однако console.log перед моим методом рендеринга показывает мне, что setState был вызван до завершения всех трех отправок. Я запутался, пожалуйста, помогите!

РЕДАКТИРОВАТЬ:

Вот мои действия:

export const loadTransitions = (workflow_id) =>(dispatch) => {
axiosInstance
.get(`/workflow/transition-meta/list/${workflow_id}/`)
.then((res) => {
  dispatch({
    type: LOAD_TRANSITIONS,
    transitions : res.data,
    state_class_mapping: {}
  });
})
.catch((err) => dispatch(returnErrors(err.response.data, 
err.response.status)));
};

export const loadWorkflow = (workflow_id) =>(dispatch) => {
    axiosInstance
    .get(`/workflow/get/${workflow_id}/`)
    .then((res) => {
      dispatch({
        type: LOAD_WORKFLOW,
        workflow : res.data,
      });
    })
    .catch((err) => dispatch(returnErrors(err.response.data, err.response.status)));
};


export const loadStates = (workflow_id) =>(dispatch) => {
  axiosInstance
  .get(`/workflow/state/list/${workflow_id}/`)
  .then((res) => {
    dispatch({
      type: LOAD_STATES,
      states : res.data,
    });
  })
  .catch((err) => dispatch(returnErrors(err.response.data, err.response.status)));
};

редактировать v2

Вот код, но он все еще кажется для isDone устанавливается значение true перед запуском отправки fini sh

export const WorkflowApiGet = (workflow_id) =>(dispatch) => {
  dispatch({
   type: IS_DONE,
   isDone: false
  })
  loadTransitions(workflow_id ,dispatch)
  loadWorkflow(workflow_id, dispatch)
  loadStates(workflow_id, dispatch)
  dispatch({
   type: IS_DONE,
   isDone: true
  })
 }         


async function loadTransitions(workflow_id ,dispatch) { 
  dispatch({
   type: LOAD_TRANSITIONS,
   transitions : {}
  })
  try {
  const res = await axiosInstance.get(`/workflow/transition-meta/list/${workflow_id}/`)
  dispatch({
    type: LOAD_TRANSITIONS,
    transitions : res.data,
    state_class_mapping: {}
  })
  }
  catch (err) { dispatch(returnErrors(err.response.data, err.response.status));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...