基本上我想这样做。
ProjectService:
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
UserService:
get uniqueId() {
return this.afAuth.auth.currentUser.uid;
}
问题是currentUser是异步的,并不总是准备就绪。因此,基本上,我如何确保我的getter函数始终返回一个uid,以及如何确保使用该ref的方法等待以干净的方式设置ref?
我对此了解: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在某些时候不为null的唯一方法是在组件本身中等待。这使我可以最大程度地控制何时真正返回用户。我真正想要的是一个中心点,我在其中等待用户(服务),如果准备就绪,则加载组件。由于组件彼此独立工作,因此现在完成的方式将导致大量重复。
答案 0 :(得分:1)
您应该等待afAuth
在需要的地方uniqueID
进行初始化。
例如在ProjectService中,您将获得:
// wait here for afAuth to be ready, you have to inject it.
privateFolderRef = this.db.collection('users').doc('private').collection(this.userService.uniqueId);
publicFolderRef = this.db.collection('users').doc('public').collection(this.userService.uniqueId);
根据afAuth
的实现,如果可能,您可能会subscribe
对此有所选择。
编辑:
如果您有权访问afAuth
服务,并且无法检测到它何时初始化,则可以创建一个Observable来接收数据。
选中https://rxjs-dev.firebaseapp.com/guide/subject