【发布时间】:2018-04-24 14:54:44
【问题描述】:
我正在 React 应用程序中编写动作创建器。当我进行一些 api 调用时,我需要在屏幕上显示 Progress Loader。所以,我的动作创建器看起来像这样。
export const fetchData = (actionType, param) => (dispatch) => {
dispatch(Action(ActionConstants.SHOW_PROGRESS_LOADER)); // Show Loader Action
return fetchDataRequest(actionType, param) // Here is Fetch APi Call
.then(responseData => {
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER));
dispatch(Action(recd(actionType), { data: responseData, receivedAt: Date.now() }));
}).catch((error) => {
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER)); // Hide Loader Action
});
};
当我编写这段代码时,它按预期工作,我将操作作为 dispatch(fetchData(data)) 从组件分派,并且我能够在我的父组件中显示加载器。我的理解是 fetch 正在向我返回承诺。获取完成后,我将隐藏按预期工作的加载程序。
现在,在某些情况下,我需要进行一些验证,而我不必进行任何 api 调用,但所有验证都在本地执行。 在这里我也想做同样的事情,就像我需要在我的父组件中显示加载器一样,当所有验证完成后我需要隐藏加载器。 我编写了相同的代码,即使操作被调用但我的渲染函数没有被调用。 我的代码如下:
// This my action creator which will actually do the validation
export const validateAndSaveData = () => {
return ((dispatch, getState) => {
return new Promise((resolve, reject) => {
let saveRecommendDetailsFlag = true;
// here i am dispacthing some action and storing data in my store
saveRecommendDetailsFlag = canSaveData(getState());
if (saveRecommendDetailsFlag) {
resolve('SUCCESS');
} else {
reject('ERROR');
}
});
});
};
还有一个动作创建者,我从 UI 组件调用它,它将首先启动显示加载器动作,然后执行验证,根据验证结果我必须隐藏加载器。
export const saveData = () => {
return ((dispatch) => {
dispatch(Action(ActionConstants.SHOW_PROGRESS_LOADER)); // Show Loader Action
return dispatch(validateAndSaveData())
.then(() => {
// Here i m dispatching an action to do some more processing.
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER)); // Hide Loader Action
})
.catch(() => {
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER)); // Hide Loader Action
});
});
};
一切正常,但我的加载程序没有出现在屏幕上。我无法弄清楚我在哪里做错了。
谁能建议我如何解决这个问题? 我使用 setTimeout 函数得到了一些解决方法,但我认为这不是正确的方法。
export const saveData = () => {
return ((dispatch) => {
dispatch(Action(ActionConstants.SHOW_PROGRESS_LOADER)); // Show Loader Action
setTimeout(()=>return dispatch(validateAndSaveData())
.then(() => {
// Here i m dispatching an action to do some more processing.
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER)); // Hide Loader Action
})
.catch(() => {
dispatch(Action(ActionConstants.HIDE_PROGRESS_LOADER)); // Hide Loader Action
});
},10);
});
};
【问题讨论】:
-
你有
validateAndSaveData和validateAndSaveOverviewDetails,它们是同一个东西吗?如果没有,请发布validateAndSaveOverviewDetails的代码
标签: react-redux