我的项目中有这种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的指针!
答案 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})
),
对于一般调整:稍微简化一下(如果可能的话)-简化为ofs
,switchMaps
,或者看看zip/combineLatest/etc
之间的区别