我有一个Redux(井,rxjs-store)结构非常通用。基本上,我的数据类型都是通用数据结构的所有不同版本,称为"元素" (每个由不同的" ElementType")定义。
目标是当新数据对象出现时,我不必向商店,API,后端,数据库等添加一组全新的数据对象。
到目前为止这种方法运行良好,但我遇到过Redux& amp;的问题。重新选择选择器多次重新计算的位置。
这是一个例子。对于我的页面,我需要加载4组特定类型的元素:
// subscribe to data
const elements$ = Observable.combineLatest(
this.elementTypeManager.getElementTypeByName('DistributionNetworkNode'),
this.elementTypeManager.getElementTypeByName('Socket'),
this.elementTypeManager.getElementTypeByName('Area'),
this.elementTypeManager.getElementTypeByName('DemandType'))
.switchMap(nodeAndSocketTypes => Observable.combineLatest(
this.elementManager.getElementsByType(nodeAndSocketTypes[0].id),
this.elementManager.getElementsByType(nodeAndSocketTypes[1].id),
this.elementManager.getElementsByType(nodeAndSocketTypes[2].id),
this.elementManager.getElementsByType(nodeAndSocketTypes[3].id)));
elementTypeManager和elementManager是发出Redux Action的服务,并使用reselect来查询商店,如下所示:
public getElementsByType(elementTypeId: AAGUID): Observable<Elements> {
// dispatch an action to the store (triggers http and storing data)
this.store.dispatch(this.elementActions.loadElementsForType(elementTypeId));
// use reselect to query store
return this.store.select(getElementsByTypeFactory(elementTypeId));
}
Load Elements
操作会触发http请求以检索数据,并发出Store Elements Data
操作,reducer会将该操作放入存储中。
重选选择器非常简单,如下所示:
export const getElements = (state: AppState) => state.elements;
export function getElementsByTypeFactory(elementTypeId: AAGUID, includeValues: boolean = false) {
return createSelector([getElements],
(elements: Elements) => elements.filter(e => e.elementTypeId === elementTypeId));
}
它采用指定类型的元素和过滤器。
问题是,按顺序调用操作:
Load Elements (DistributionNetworkNode)
Load Elements (Socket)
Load Elements (Area)
Load Elements (DemandType)
然后,按顺序存储:
Store Element Data (DistributionNetworkNode)
Store Element Data (Socket)
Store Element Data (Area)
Store Element Data (DemandType)
每次reducer将数据放入商店时,重新选择重新计算。当然,它尚未完成所有数据的输入,因此其他选择器返回0结果。
因此,我的CombineLatest
会发出4次,其中一次仅包含DistributionNetworkNode
个数据,一次包含DistributionNetworkNode
和Socket
数据,一次包含{{1} }},DistributionNetworkNode
和Socket
数据等等。
这是我的数据结构方式以及我如何使用重新选择的持续问题,而且我不确定如何在不影响数据结构的通用方式的情况下克服它。< / p>
在重新选择查询/发布数据之前,如何确保所有商店元素数据操作都已发生?