从API加载数据后,从商店加载特定数据

时间:2020-02-07 10:52:54

标签: angular rxjs ngrx-effects

我的项目中有这种RXJS的效果,在该操作中,我正在从服务器上加载组织,然后尝试基于{{1 }}。效果结束时,我将成功操作与数据一起分发。

NGRX

问题是我的成功行动永远不会触发,我也不会抛出任何organisation ID。 我可以断点在所有 selectOrganisation$ = createEffect(() => this.actions$.pipe( ofType(OrganisationsActionTypes.SelectOrganisation), withLatestFrom( this.store.pipe(select(AuthSelectors.selectCurrentUser)), this.store.pipe(select(ContextSelectors.getContext)) ), switchMap(([action, user, context]) => forkJoin([ of(user), of(context), this.organisationService.getOrganisationById(context, action.id), this.moduleService.getAllSimpleModules(context) ]) ), switchMap(([user, context, organisation, modules]) => forkJoin([ of(organisation), of(modules), this.store.pipe(select(BookmarkSelectors.selectBookmarkByOrganisation, { userId: user.id, context, organisationKey: organisation.key })) ]) ), switchMap(([organisation, modules, bookmark]) => [ onSelectOrganisation({organisation, modules, bookmark}) ]), catchError(error => of(onSelectOrganisationError())) )); 中的效果,并查看数据除最后一个数据外都不会被点击,因此我怀疑我的书签选择器可能有问题。

我的书签选择器如下所示,并且当前数组中没有书签,因此此函数返回error

switchMaps

对我来说,这似乎有些混乱,我正在寻找一些有关如何改进此代码并同时压缩此bug的指针!

1 个答案:

答案 0 :(得分:1)

似乎最后一个forkJoin不会发出任何东西(根据定义)

如果内部可观察对象没有完成forkForin,则永远不会发出值!

遵循您的选择器应该complete

我建议在选择器上使用take(1)/first来完成选择(也可以尝试使用startWith(但我认为undefined应该可以))。

此外,“动作” switchMap转移到map-无需“拼合”

应该这样工作:

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})
),

对于一般调整:稍微简化一下(如果可能的话)-简化为ofsswitchMaps,或者看看zip/combineLatest/etc之间的区别

相关问题