Angular 从API加载数据后从存储加载特定数据

Angular 从API加载数据后从存储加载特定数据,angular,rxjs,ngrx-effects,Angular,Rxjs,Ngrx Effects,我在我的项目中有这种RXJS效果,在一个操作中,我从服务器加载一个组织,然后尝试根据组织ID从NGRX存储中选择一个书签。在效果结束时,我用数据发送我的成功操作 选择Organization$=createEffect=>this.actions$.pipe OfTypeOrganizationsActionTypes.selectOrganization, 最晚从 this.store.pipeselectAuthSelectors.selectCurrentUser, this.store.

我在我的项目中有这种RXJS效果,在一个操作中,我从服务器加载一个组织,然后尝试根据组织ID从NGRX存储中选择一个书签。在效果结束时,我用数据发送我的成功操作

选择Organization$=createEffect=>this.actions$.pipe OfTypeOrganizationsActionTypes.selectOrganization, 最晚从 this.store.pipeselectAuthSelectors.selectCurrentUser, this.store.pipeselectContextSelectors.getContext , switchMap[操作、用户、上下文]=> 分叉连接[ 用户, 当然, this.organizationservice.getOrganizationById上下文、action.id、, this.moduleService.getAllSimpleModulescontext ] , switchMap[用户、上下文、组织、模块]=> 分叉连接[ 组织方面, 关于模块, this.store.pipeselectBookmarkSelectors.selectbookmarkbyorganization{ userId:user.id, 上下文 组织密钥:organization.key } ] , switchMap[组织、模块、书签]=>[ OnSelectorganization{organization,modules,bookmark} ], catchErrorerror=>OfOnSelectorganisatorError ; 问题是,我的成功行动从不触发,我也不会抛出任何类型的错误。 我可以在所有开关映射中中断效果,并查看除最后一个以外的数据,最后一个从未被击中,因此我怀疑我的书签选择器可能有问题

我的书签选择器如下所示,此时数组中没有书签,因此此函数返回undefined

导出常量SelectBookmarkByOrganization=createSelector 选择所有书签, 书签:BookmarkDto[],props=>{ const bookmark=\链书签 .filterb=> b、 userId==props.userId &&b.serverContext==props.context &&b.OrganizationKey==道具.OrganizationKey 第一 价值 返回书签; } ; 对我来说,这似乎有点混乱,我正在寻找一些关于如何改进此代码并同时消除此错误的建议

似乎最后一个forkJoin没有从定义中发出任何东西

如果内部可观察对象未完成,forkJoin将永远不会发出值

遵循选择器应该完成的步骤

我建议在选择器上使用take1/first来完成它,另外,尝试使用startwith,但我认为undefined应该可以

此外,动作的开关地图转移到地图-无需展平

应该这样做:

switchMap(([user, context, organisation, modules]) =>
  forkJoin([
    of(organisation),
    of(modules),
    this.store.pipe(
      select(BookmarkSelectors.selectBookmarkByOrganisation, {
        userId: user.id,
        context,
        organisationKey: organisation.key
      }),
      take(1),
    )
  ])
),
map(([organisation, modules, bookmark]) =>
  onSelectOrganisation({organisation, modules, bookmark})
),
对于一般的调整:若可能的话,将其简化一点-对于很多的,开关映射,也许可以看看zip/CombineTest/etc之间的区别