在使用NGRX进行复杂初始化时需要一些帮助
我在我的一条路由上使用了一个CanActivate保护,以确保我的NGRX存储是用我的组件的必要数据初始化的。我正在学习这篇文章(https://stackoverflow.com/a/48652379/1568482)中的例子,并以此为基础。
这是我的CanActivate警卫的逻辑
outputGrp$ = this.store.pipe(select(selectOutputGroup));
inputGrp$ = this.store.pipe(select(selectInputGroup));
-----------------------------------------
return <Observable<boolean>>this.store.select(selectGroupsLoaded).pipe(
map(loaded => {
if(!loaded)
this.store.dispatch(loadMainCanvas());
return loaded;
}),
filter(loaded => !!loaded),
take(1),
withLatestFrom(this.outputGrp$), //Get Output Group ID
tap(([loaded, og]) => this.outputGroupId = <string>og?.id),
filter(loaded => !!loaded),
take(1),
map((data) => data[0]),
withLatestFrom(this.inputGrp$), //Get Input Group ID
tap(([loaded, ig]) => this.inputGroupId = <string>ig?.id),
filter(([loaded, ig]) => !!loaded),
take(1),
//THIS NEVER GETS EVALUATED AGAIN AFTER STORE IS UPDATED FROM CALL BELOW!!!
withLatestFrom(this.store.select(selectInputGroupProcessorsLoaded)), //See if Input Group Processors Loaded
map(([l1, loaded]) => {
if(!loaded)
this.store.dispatch(loadProcessorsForGroup({groupId: this.inputGroupId, groupType: 'input'}));
return loaded;
}),
filter(loaded =>!!loaded),
take(1),
// GET: ERROR Error: Uncaught (in promise): EmptyError: no elements in sequence
}
在我的存储库中,我存储要测试的每一件东西的布尔值,以查看数据是否已加载。我在这里评估这些值,如果它们没有加载,我会发出一个调用来检索数据并更新存储。
在加载了“主画布”项之后,我在这里为将来的调用(groupIds)继续并检索一些必要的数据。数据加载,我可以用必要的数据来设置变量。
当我到达withLatestFrom(this.store.select(selectInputGroupProcessorsLoaded))
时,它的计算结果为FALSE,并落入map()
函数中。在那里,商店发出一个调用来检索数据,并且商店被成功更新,但是.selectInputGroupProcessorsLoaded
似乎没有改变,导致语句被重新评估。
我还有一些类似的章节,它们都是以同样的方式失败的。
发布于 2022-08-17 12:43:34
所以,把withLatestFrom
切换到switchMap
解决了我的问题!
https://stackoverflow.com/questions/73384977
复制相似问题