我正在做一个使用react-redux和redux-thunk进行开发的项目。以前的方法是逐个检查API调用,然后手动检查是否所有数据都被提取。我发现在v7.0之后,react-redux
中引入了batch
来帮助解决这个问题。但是页面也需要加载指示符。
目前的方法是在批处理中进行几次调度,以减少不必要的重新渲染,并手动检查是否在渲染中获取了所有数据,但我想知道是否有任何其他方法可以应用于batch
,以减少一些硬代码检查。
下面是当前的示例代码:
// in action file
...
function fetchSomeData() {
// call api to store data
return dispatch => {
batch(() => {
dispatch(fetchData1());
dispatch(fetchData2());
dispatch(fetchData3());
..some more dispatches...
});
}
}
...
// in react component
dataLoaded(){
....retrieve all the data from different places...
if (!data1) return false;
if (!data2) return false;
...check all the data...
return true;
}
...
render() {
if (this.dataLoaded()) {
return actual_content;
} else {
return loading_content;
}
}
...
我尝试直接使用then
,并创建另一个方法,返回batch
,调用fetchSomeData
,然后使用then()
,但都产生“无法读取未定义的属性'then'”错误。
我也用过Promise.all
,但是没有用,Promise.all
的用法如下:
function fetchSomeData() {
// call api to store data
return dispatch => {
Promise.all([
dispatch(fetchData1());
dispatch(fetchData2());
dispatch(fetchData3());
..some more dispatches...
])
.then(() => dispatch(setLoading(false)));
}
}
我还检查了其他帖子的stackoverflow,但许多帖子建议其他中间件,和额外的依赖性需要批准,因为其中一个要求是有限的带宽,使用最小的依赖性需要。
1条答案
按热度按时间yfjy0ee71#
Redux Toolkit实际上帮助我解决了这个问题。一个示例代码如下所示:
这个动作不一定是异步thunk,编写一个自定义thunk也可以。
结果如下所示:
fetch home thunk等待所有异步thunk解析完毕,然后发出最终结果。
参考:Dispatch action on the createAsyncThunk?