我在将对象放入应用程序状态时遇到麻烦。
我需要使用从firebase.user
和user.getIdTokenResult(true)
返回的数据装入对象。
示例:
userLogged = {
uid: user.uid,
displayName: user.displayName
admin: false,
};
const token = await user.getIdTokenResult (true);
userLogged.admin = token.claims.admin;
逻辑与上面的逻辑相似,但是我只需要使用Rxjs运算符来执行此操作,这样我就可以在应用程序状态下隔离该对象。
@效果
@Effect()
getUser$: Observable<Action> = this.actions$.pipe(
ofType(auth.AuthActionTypes.GET_USER),
switchMap(() => this.authService.getUser().pipe(
map(user => {
const userLogged = {
uid: user.uid,
displayName: user.displayName,
admin: false,
}
// **** i need call user.getIdTokenResult() ******
// and get claims.admin and assign to userLogged object admin.
// authState = {
// uid: user.uid,
// displayName: user.displayName,
// admin: true, // true or false
// }
return new auth.Authenticated(userLogged);
}),
catchError((err => of(new auth.AuthError(err))))
)
我仍在使用Rxjs进行反应式编程来适应自己,因此我很难合并封装的Observables数据。
答案 0 :(得分:0)
您可以使用.map()
在您的user
结果中“保留” authService.getUser()
对象的值。尽管很脏,但它仍然有效。
@Effect()
getUser$: Observable<Action> = this.actions$
.pipe(
ofType(auth.AuthActionTypes.GET_USER),
switchMap(() => this.authService.getUser()),
switchMap(user => user.getIdTokenResult().pipe(map(claims => ({claims, user}))), //map the user to "retain"
switchMap(({claims, user}) => {
const userLogged = {
uid: user.uid,
displayName: user.displayName,
admin: claims.admin,
};
return new auth.Authenticated(userLogged);
}),
catchError(err => of(new auth.AuthError(err)))))
如果您想重新训练更多的值,建议您考虑一下Subjects
,以使其更清洁(以及正确的执行方式)。