我正在使用Redux(+ thunk)从我的API中获取数据。我实现了一个Data Fetcher组件,该组件调用所有动作,并在完成后调度LOADED。在我渲染内容的实际主要组件中,我等到道具中的isLoaded
标志设置为true。
这是数据提取器中的方法:
const fetchData = () => {
if (isAuthenticated) {
const p = [];
p.push(fetchDataSetOne());
p.push(fetchDataSetTwo());
Promise.all(p).then( () => setHasLoaded() );
}
}
这些获取方法中的每一个都返回axios承诺,在这样的方式下,一旦检索到,我就会派遣:
export const fetchDataSetOne = () => dispatch => {
return axios.get(`${API_URL}/dataSetOne`)
.then(res => {
dispatch({
type: FETCH_ALL_DATA_SET_ONE,
payload: res.data.docs
});
});
};
在组件的渲染函数中,我仅在加载时渲染内容(由setHasLoaded
操作的LOADED调度设置),如下所示:
{ hasLoaded && <MyContent> }
即使我“等待”动作完成(= Promise.all),在设置获取的数据之前,我的变量hasLoaded仍设置为true。有人可以帮忙吗?
答案 0 :(得分:1)
问题是您返回的是函数而不是诺言。
这会立即解决。
查看有效的code sample
export const fetchData2 = dispatch => () => {
dispatch({type: 'START_FETCH'})
const p = [
fetchDataSetOne(dispatch),
fetchDataSetTwo(dispatch)
];
Promise.all(p).then((res) => setHasLoaded(res));
};
// this returns a promise AFTER it calls an action
const fetchDataSetOne = dispatch => {
return axois.get(`${API_URL}/dataSetOne`).then(res => {
dispatch({
type: "FETCH_ALL_DATA_SET_ONE",
payload: res.data.docs
});
});
};
这在两个诺言都解决后解决,但是状态在每个诺言都解决后更新。要在所有承诺都解决后更新状态,请尝试以下操作:
export const fetchData3 = dispatch => () => {
dispatch({ type: "START_FETCH" });
const p = [
axois.get(`${API_URL}/dataSetOne`),
axois.get(`${API_URL}/dataSetTwo`)
];
Promise.all(p).then(callActions(dispatch));
};
const callActions = dispatch => res => {
dispatch({
type: "FETCH_ALL_DATA_SET_ONE",
payload: res[0].data.docs
});
dispatch({
type: "FETCH_ALL_DATA_SET_TWO",
payload: res[1].data.docs
});
setHasLoaded(res);
};