在完成所有数据操作之前,防止重新选择重新计算

时间:2017-05-31 10:12:48

标签: redux reselect

我有一个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个数据,一次包含DistributionNetworkNodeSocket数据,一次包含{{1} }},DistributionNetworkNodeSocket数据等等。

这是我的数据结构方式以及我如何使用重新选择的持续问题,而且我不确定如何在不影响数据结构的通用方式的情况下克服它。< / p>

在重新选择查询/发布数据之前,如何确保所有商店元素数据操作都已发生?

0 个答案:

没有答案