Как установить асинхронную ссылку на firestore в сервисе в зависимости от получения UID от другого сервиса? - PullRequest
0 голосов
/ 01 июля 2019

В основном я хочу сделать это.

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, ожидает установки refs чистым способом?

Я знаю об этом: TypeError: Невозможно прочитать свойство '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);
    })
  }

Обновление Работает не во всех случаях, при перезагрузке функция конструктора выполняется после обычного вызова метода в классе.Возвращает undefined приводит к сбою приложения.

Обновление 2 Единственный способ, которым я был уверен, что auth не был нулевым в определенный момент, - это ожидание в самом компоненте.Это дало мне максимальный контроль над тем, когда пользователь действительно вернулся.Что я действительно хотел, так это центральная точка, где я жду пользователя (службы) и, если он готов, загружает компонент.То, как это делается сейчас, вызовет много дублирования, так как компоненты работают независимо друг от друга.

1 Ответ

1 голос
/ 01 июля 2019

Вам следует подождать, пока 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, если это возможно, возможен вариант.

EDIT:

Если у вас есть доступ к услуге afAuth и вы не можете определить, когда она инициализирована, вы можете создать Observable из полученных данных. Проверьте https://rxjs -dev.firebaseapp.com / руководство / тема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...