我有一个名为“用户”的集合,其中包含一些虚拟数据,如下所示:
uid: {
admin: false,
uid: 'longhash',
displayName: 'User Name',
email: 'user@email.com'
}
我在处理从文档中异步检索和返回'admin'数据时遇到问题。
我的代码:
isAdmin:Observable<boolean> = this.uid.pipe(
switchMap(uid => {
if(!uid){
return observableOf(false);
} else {
let user = new BehaviorSubject<string>(uid);
return user.pipe(
switchMap(page =>
this.afs.collection<User>('users', ref => ref.where('uid', '==', uid)).snapshotChanges().pipe(
map(changes => {
return changes.map(userData => {
const cUser = userData.payload.doc.data() as User;
return cUser ? cUser.admin : false;
});
})
)
)
);
}
})
);
有人知道我在做什么错吗?
答案 0 :(得分:1)
在switchMap运算符中,您将返回一个返回布尔值的观察值或一个布尔值数组的观察值,这与isAdmin常量const isAdmin:Observable<boolean>
的类型声明不对应。尝试类似以下操作:isAdmin: Observable<boolean> | Observable<boolean[]>
,它应该可以修复类型错误。
如果您的目标是返回一个布尔值而不是一个布尔值数组,并假设您的用户集中只有一个文档包含您的uid,那么请尝试以下操作:
isAdmin:Observable<boolean> = this.uid.pipe(
switchMap(uid => {
if(!uid){
return of(false);
} else {
return of(uid).pipe(
switchMap(page =>
this.afs.collection<User>('users', ref => ref.where('uid', '==', uid).limit(1)).snapshotChanges().pipe(
map(changes => {
return changes.map(userData => {
const cUser = userData.payload.doc.data() as User;
return cUser ? !!cUser.admin : false;
})[0];
})
)
)
);
}
})
);