我在这里就 ngrx 效果与您联系,我尝试做的是有一个函数登录,它可以分配一个动作类型登录,并且对这个动作的影响将使用我的服务进行 api 调用。在此返回令牌之后,我想调度另外两个操作,一个是 getUserMenu 类型,另一个是 getUserInfo 类型。这两个动作的类型不同,效果也不同。
我最后有 3 个商店:一个用于令牌,一个用于用户信息,一个用于菜单信息
我试过这样的事情:
login = createEffect(
() =>
this.actions$
.pipe(
ofType(authLogin),
tap(action => {
console.log("EFFECT LOGINNNN");
return this.authService.postLogin(action.username,
action.password).pipe(
map((data: any) => {
console.log("AUTHTHHTHTH DATATA ", data);
let props = data.token;
let payload = {
token: data.token,
isAuthenticated: true
}
this.store.dispatch(moMenuHttpGetListAction({US_ID: action.username}));
this.store.dispatch(userHttpGetInfoAction({US_ID:action.username}));
this.localStorageService.setItem(AUTH_KEY, payload);
}))
})
),
{ dispatch: true }
);
Run Code Online (Sandbox Code Playgroud)
如果我设置 dispatch false 登录工作但没有调用获取用户信息和用户菜单的方法但是当我设置 dispatch true 我有 infinit 循环同样的效果,动作 moMenuHttpGetListAction 看起来像这样:
moMenuHttpGetListEffect = createEffect(
() => this.actions$.pipe( …Run Code Online (Sandbox Code Playgroud) 我在这里有点挣扎:我在 ngrx 效果中,我想对我的服务进行身份验证,并根据我的服务的回答,分派到操作以检索信息,然后才分派“YEAH LOGIN IS”类型的操作好的”
this is my code so far
this.actions$.pipe(
ofType(AuthActions.QuickLogin),
switchMap((action: any) =>
this.authService.postQuickLogin$(action.QuickVerifString).pipe(
switchMap(resultService => {
const props = {
username: resultService['username'],
token: resultService['token'],
isAuthenticated: true
}
this.localStorageService.setItem(AUTH_KEY, props)
return [
MoMenuActions.moMenuHttpGetListAction({ US_ID: props.username }),
UserActions.userHttpGetInfoAction({ US_ID: props.username }),
AuthActions.LoginSucceed(props)
]
}),
catchError(error => of(AuthActions.LoginError({ error })))
)
)
)
Run Code Online (Sandbox Code Playgroud)
这运行良好。直到我遇到在 momenuaction 和 useraction 中出现 http 错误的问题,并且我没有输入我的 catch 错误。这是正常的,因为 switchMap 取消了前一个 observable 而只取最后一个。我可以先映射然后映射然后映射 LoginSucceed 但在这种情况下我没有道具来调度我的 LoginSucceed
所以我不仅在寻找一种方法来做到这一点,而且在寻找“好的”/正确的方法来做到这一点。
如果有人有任何解决方案和原因的解释?
我在这里有点挣扎我有以下选择器
export const selectMoMenuInfoByIdDynamic = createSelector(
selectMoMenuState,
state => (meId: string) => {
let currentMenu: MoMenu
console.log(state.MoMenuItems)
currentMenu = state.MoMenuItems.find(element => {
return element.ME_ID === meId
})
return currentMenu
}
)
Run Code Online (Sandbox Code Playgroud)
但当我调用它时无法让它工作
const moMenu = this.store.pipe(
select(selectMoMenuInfoByIdDynamic),
map(res => res(meId))
)
console.log(moMenu)
Run Code Online (Sandbox Code Playgroud)
对我有什么想法吗?
会有很大的帮助 提前致谢