Как дождаться загрузки данных из Firestore перед запуском функций Angular

# #angular #typescript #firebase #google-cloud-firestore #angularfire

Вопрос:

Текущая ситуация:

У меня есть служба, которая считывает данные из облачного магазина Firestore с employee.service.ts :

 getEmployeeList(orgID: string) {
    return this.firestore.collection('orgData').doc(orgID).collection('employeeList').snapshotChanges();
  }
 

Я использую эту службу для чтения данных в моем компоненте из component.ts :

 export class ManageEmployeesComponent implements OnInit {
    newEmployee: FormGroup;
    Employees: Employee[];

    selectedOrganization: string;
  
    @Input() set selectOrg(org: string) {
      this.selectedOrganization = org;
      this.getEmployees();
      this.formsInit();
    }

    getEmployees() {
      this.employeeService.getEmployeeList(this.selectedOrganization).subscribe(data => {
        this.Employees = data.map(e => {
          return {
            id: e.payload.doc.id,
            ...e.payload.doc.data() as Employee
          };
        })
      });
    }

    formsInit() {
        //some reactive form stuff
    }
}
 

Проблема:

Каждый раз selectOrg , когда ввод задается, он выполняется getEmployees formsInit синхронно. Проблема в том, что мне нужно, чтобы некоторые данные getEmployees() были полностью загружены перед запуском formsInit() .

Вопрос

Как мне переписать этот код так, чтобы formsInit он ждал getEmployees завершения своих асинхронных операций?

Правка 1:
Лучшее, что я могу сейчас придумать, — это изменить getEmployees() , чтобы принять необязательный аргумент, который является функцией, для запуска после получения данных. Хотя я не уверен, насколько практичным или чистым это было бы.

Ответ №1:

Вы могли бы просто позвонить formsInit() из своей getEmployees функции, например:

 export class ManageEmployeesComponent implements OnInit {
    newEmployee: FormGroup;
    Employees: Employee[];

    selectedOrganization: string;
  
    @Input() set selectOrg(org: string) {
      this.selectedOrganization = org;
      this.getEmployees();
    }

    getEmployees() {
      this.employeeService.getEmployeeList(this.selectedOrganization).subscribe(data => {
        this.Employees = data.map(e => {
          return {
            id: e.payload.doc.id,
            ...e.payload.doc.data() as Employee
          };
        });
        this.formsInit();
      });
    }

    formsInit() {
        //some reactive form stuff
    }
}
 

Комментарии:

1. Это работает. Есть ли какой-либо способ передать функцию для запуска и сохранить ее область действия? Проблема, с которой я столкнулся, заключалась в том, что если бы я передал formsInit в качестве аргумента для запуска, этот.formsInit() не работал бы в той же области, как если бы я его жестко закодировал, поэтому у него не было доступа к необходимым данным