如何在服务中设置火存储引用异步,从其他服务获取 UID?



基本上我想这样做。

项目服务:

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

相关内容

  • 没有找到相关文章

最新更新