В основном я хочу сделать это.
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 не был нулевым в определенный момент, - это ожидание в самом компоненте.Это дало мне максимальный контроль над тем, когда пользователь действительно вернулся.Что я действительно хотел, так это центральная точка, где я жду пользователя (службы) и, если он готов, загружает компонент.То, как это делается сейчас, вызовет много дублирования, так как компоненты работают независимо друг от друга.