我在下面的代码块中使用“ rxjs”:“〜6.2.0”
lit.click
userService的get方法具有以下逻辑。
canActivate():Observable<boolean>
{
return this.auth.user$.pipe
(
switchMap(
user =>
{
return this.userService.get(user.uid);
}
)
).pipe( map( appUser => appUser.isAdmin))
}
我遇到错误
“类型'(user:User)=> AngularFireObject'的参数不是 可分配给类型'(值:用户,索引:数字)=>的参数 ObservableInput”。类型“ AngularFireObject”不是 可分配给类型“ ObservableInput”。 类型“ AngularFireObject”不可分配给类型“ Iterable”。 类型“ AngularFireObject”中缺少属性“ [Symbol.iterator]”。”
答案 0 :(得分:2)
您无需在此处使用两个管道,map
的结果appUser.isAdmin
使用同一管道。
canActivate():Observable<boolean>
{
return this.auth.user$
.pipe(
switchMap(user => this.userService.get(user.uid)),
map(appUser => appUser.isAdmin)
)
}
此外,您还应该修改userService.get()
以返回从Observable
获得的正确的valueChanges()
get(uid : string): Observable<any>
{
return this.db.object('/users/'+ uid).valueChanges();
}
答案 1 :(得分:0)
传递给SwitchMap
的参数应该是Observable
,但是this.userService.get(user.uid)
返回AngularFireObject<AppUser>
。
AngularFireObject
来自AngularFire。我没有使用AngularFire,但是从我得到的结果来看,您必须在valueChanges()
上调用AngularFireObject
才能获得Observer
。因此,如果您可以更改UserService,它应该如下所示:
get(uid : string): Observable<AppUser>
{
return this.db.object('/users/'+ uid).valueChanges();
}
正如Amit Chigadani所述,您应该将switchMap和map放在同一管道中,并简化switchMap中的箭头功能。