Привет, ребята, я столкнулся с проблемой с 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));
}
}