【发布时间】:2019-11-12 04:45:09
【问题描述】:
基本上我想这样做。
项目服务:
privateFolderRef = this.db.collection('users').doc('private').collection(this.userService.uniqueId);
publicFolderRef = this.db.collection('users').doc('public').collection(this.userService.uniqueId;
//later in service
this.getProjects() { this.privateFolderRef.doc('name')};//not async
用户服务:
get uniqueId() {
return this.afAuth.auth.currentUser.uid;
}
问题是 currentUser 是异步的,并不总是准备好。所以基本上我将如何确保我的 getter 函数始终返回一个 uid,我能做些什么来确保使用该 ref 的方法等待以干净的方式设置 refs?
我知道这件事:TypeError: Cannot read property 'uid' of null
在组件中等待会给我留下很多重复。真的不想那样做。有人找到了一种解决方案,可以在服务中做到更清洁吗?
已解决 没有办法从另一个服务中检索一致的 UID,所以我就这样解决了。在服务本身中执行此操作。
privateFolderRef;
publicFolderRef
constructor(
private db: AngularFirestore,
public afAuth: AngularFireAuth
) {
this.afAuth.authState.subscribe(user => {
this.privateFolderRef = this.db.collection('users').doc('private').collection(user.uid);
this.publicFolderRef = this.db.collection('users').doc('public').collection(user.uid);
})
}
更新 并非在所有情况下都有效,重新加载时,构造函数在类中的正常方法调用之后执行。返回未定义的应用程序崩溃。
更新 2 我确定 auth 在某个时刻不为空的唯一方法是在组件本身中等待。这让我可以最大程度地控制用户何时真正返回。我真正想要的是一个等待用户(服务)的中心点,如果准备好了,然后加载一个组件。现在的做法会导致很多重复,因为组件彼此独立工作。
【问题讨论】:
标签: angular firebase google-cloud-firestore observable angular-services