Вы можете попытаться использовать Promise.all()
для извлечения нескольких обещаний в один объект. Вот пересмотренная версия вашего метода, которая должна дать желаемый результат, если я правильно понимаю ваш вопрос:
async processData() {
const clientCollection = await firebase.firestore().collection(`clients`).get();
const jobsCollection = await firebase.firestore().collection(`jobs`).get();
const clients = [];
clients.push(clientCollection);
clients.push(jobsCollection);
const res = await Promise.all(clients);
// res should equal a combination of both querySnapshots
}
Я просто пересоздал переменные коллекции, чтобы показать, что добавить в массив, но Promise.all()
принимает массив обещаний и разрешает их все в один массив, так как метод get()
в firestore
является обещанием. Это также использует async / await. Надеюсь, это поможет!
EDIT:
Поскольку вы используете AngularFire2, вы должны использовать их метод для этого.
В вашем компоненте вы захотите импортировать модуль angularfire2/firestore
и использовать предоставляемые ими методы Observable
:
Сначала импортируйте модуль: import { AngularFireStore } from 'angularfire2/firestore'
;
затем предоставьте это вашему конструктору:
constructor(
private firestore: AngularFireStore
) { }
Тогда вы можете использовать Observable.combineLatest()
для получения всех данных за один раз:
clients$: Observable<any[]>;
clients: any[];
jobs$: Observable<any[]>;
jobs: any;
joined: any;
ngOnInit() {
this.clients$ = this.getCollection('clients');
this.jobs$ = this.getCollection('jobs');
this.joined = Observable.combineLatest(this.clients$, this.jobs$);
this.joined.subscribe(([clients, jobs]) => {
this.clients = clients;
this.jobs = jobs;
});
}
getCollection(collectionName) {
return this.firestore.collection(`${collectionName}`).valueChanges();
}
В вашей разметке вы просто зациклите данные, используя *ngFor
:
<div *ngFor="let client of clients">{{ client.name }}</div>
Таким образом, ваш компонент будет прослушивать новые данные, как только Firestore получит данные, и все они появятся за один раз, поэтому у вас нет вложенных подписок, уязвимых для создания нескольких подписок. Надеюсь, что это может помочь.