我有2个动作,我从第一个动作调用到第二个动作....我需要等到第二个动作完成,然后才继续这个动作。
// first action
export const getDataFromAdmin = () => {
return async (dispatch, getState) => {
dispatch(getDeviceLocation());
console.log('only after getDeviceLocation is finsih');
AdminRepository.getDataFromAdminAndEnums(dispatch)
.then(adminData => {
//some code
})
.catch(error => {
console.log(`Splash Error = ${error.message}`);
});
};
};
//second action
export const getDeviceLocation = () => {
return async dispatch => {
dispatch({ type: actionsType.GET_DEVICE_LOCATION });
LocationManager.getCurrentPosition()
.then(location => {
dispatch({ type: actionsType.GET_DEVICE_LOCATION_SUCCESS });
})
.catch(error => {
dispatch({ type: actionsType.GET_DEVICE_LOCATION_ERROR, message: error.message });
});
};
};
3条答案
按热度按时间r7s23pms1#
不,这是不可能的,因为分派一个动作就像触发动作,动作只需要调用中间件或者reducer,就是这样,动作不会等待reducer或者中间件的完成,它只是调用并完成它的工作。
hrysbysz2#
好的,最后我把async wait by pass dispatch作为函数的一个参数。
nxagd54h3#
await dispatch
,但前提是您使用的是redux-thunk
中间件。**dispatch
是默认的同步操作。redux-thunk
中间件允许您分派作为dispatch
函数的操作,如您问题中的操作,除了标准的{ type: 'SOME_NAME' }
操作对象之外,redux-thunk
还使这些"thunk"操作的调度是异步的。这允许您使用aysnc
/调用dispatch(myThunkAction());
时使用await
或Promise.then()
下面是
redux-thunk
文档中的一个示例:您可以在
redux-thunk
docs的Composition部分查看完整的代码,了解它们是如何定义makeASandwichWithSecretSauce
thunk的。Promise
的解析值将是您在myThunkAction
函数中return
的值。通常thunk会调用dispatch
,而不会调用任何return
,因此很少使用此功能。内部函数的任何返回值都可以作为dispatch本身的返回值。这便于编排异步控制流,其中thunk操作创建者相互分派,并返回Promises以等待对方完成。
一个三个三个一个