基本上我想这样做。
项目服务:
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;
}
问题是当前用户是异步的,并不总是准备好。所以基本上我如何确保我的 getter 函数总是返回一个 uid,我能做些什么来确保使用该 ref 等待以干净的方式设置引用的方法?
我知道这一点:类型错误:无法读取空的属性"uid">
在组件中等待会给我留下很多重复。真的不想那样做。有人找到了在服务中更清洁的解决方案吗?
解决无法从另一个服务检索一致的 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我确定身份验证在某个时候不为空的唯一方法是在组件本身中等待。这让我可以最大程度地控制用户何时真正返回。我真正想要的是一个中心点,我在那里等待用户(服务),如果准备好了,然后加载一个组件。现在的完成方式将导致大量重复,因为组件彼此独立工作。
您应该等待afAuth
在需要uniqueID
的地方启动tiatiazlization。 例如,在项目服务中,您可以获得:
// 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
服务,并且无法检测到其初始化时间,则可以创建接收到的数据的可观察量。 检查 https://rxjs-dev.firebaseapp.com/guide/subject