如何通过从其他服务获取UID来在服务中设置Firestore参考异步?

时间:2019-07-01 14:09:34

标签: angular firebase google-cloud-firestore observable angular-services

基本上我想这样做。

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的唯一方法是在组件本身中等待。这使我可以最大程度地控制何时真正返回用户。我真正想要的是一个中心点,我在其中等待用户(服务),如果准备就绪,则加载组件。由于组件彼此独立工作,因此现在完成的方式将导致大量重复。

1 个答案:

答案 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