Каков рекомендуемый способ сопоставления данных с объектом и возврата их в качестве обещания / наблюдаемого при возможности добавления динамических / условных параметров в запрос.
В getCompanies2Я могу динамически добавлять параметры в запрос, но не могу понять, как сопоставить данные, возвращенные моему объекту, и вернуть их как обещание / наблюдаемое.
В getCompanies все работает так, как я хочу, но мне нужно продублировать код (как показано ниже), если у меня есть динамические параметры запроса для добавления.
Примечание: convertDocTimeStampsToDate просто делает то, что говорит. Я исключил его, чтобы уменьшить размер раздела кода.
getCompanies(searchText: string, useWhereActive: boolean): Observable<Company[]> {
if (useWhereActive) {
return this.db.collection('companies', ref => ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
.where('active', '==', true)
)
.snapshotChanges()
.pipe(
map(snaps => convertSnaps<Company>(snaps)),
first()
);
} else {
return this.db.collection('companies', ref => ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
)
.snapshotChanges()
.pipe(
map(snaps => convertSnaps<Company>(snaps)),
first()
);
}
}
getCompanies2(searchText: string, useWhereActive: boolean) {
let query = this.db.collection('companies').ref
.orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');
if (useWhereActive) {
query.where('active', '==', true);
}
query.get().then(querySnapshot => {
const results = this.convertDocuments<Company>(querySnapshot.docs);
console.log(results);
});
}
convertDocuments<T>(docs) {
return <T[]>docs.map(doc => {
return {
id: doc.id,
...doc.data()
};
});
}
export function convertSnaps<T>(snaps) {
return <T[]>snaps.map(snap => {
const data = convertDocTimeStampsToDate(snap.payload.doc.data());
return {
id: snap.payload.doc.id,
...data
};
});
}