【问题标题】:How to set a firestore reference async in service depening on getting UID from other service?如何根据从其他服务获取 UID 在服务中设置 Firestore 引用异步?
【发布时间】: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


    【解决方案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

    【讨论】:

    • 不是一个真正的选择。 Observable 只发出一个数据流。是的,我可以在返回用户时设置对它的引用,但是服务的其余部分已经加载并且一些方法已经被调用,仍然会导致应用程序崩溃。
    • 好吧,也许你让我知道了答案。我在我的 projectsService 的构造函数中等待它并设置引用,这似乎有效!但说真的,我屏住呼吸......会继续重新加载一段时间,看看是否继续工作。
    • 很好,似乎工作得很好。将发布解决方案。所以似乎没有其他服务的方法。或者也许有,但这会使事情复杂得多。
    • 很高兴它为你工作:) 这个想法是一个服务以异步方式依赖于另一个服务,所以你必须在某个地方等待它。你可以决定在哪里。
    • 对我来说,问题是一个组件也依赖于一个服务,而该服务又依赖于另一个服务。最后我只需要在组件中等待。我只是不喜欢在组件中等待的方法。我认为一个组件应该尽可能的愚蠢。但是无论如何。
    猜你喜欢
    • 2011-05-04
    • 2016-01-21
    • 2022-11-17
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多