У меня есть форма с двумя разными кнопками: одна для загрузки данных (из Firestore) и одна для отображения в реальном времени. Для этого у меня есть две функции (Angular 8), одна из которых использует valueChanges()
для отображения данных в реальном времени, а другая использует get()
для получения тех же данных и их загрузки.
Пользователь может указать поиск более или менее, поэтому у меня достаточно кода для выполнения запроса, и его необходимо удвоить, если я буду использовать и get()
, и valueChanges()
. Поэтому мне интересно, может ли кто-нибудь помочь мне адаптировать мой код с помощью get()
для использования вместо valueChanges()
, чтобы я мог использовать такой же тип запроса?
async makeQuery(value) {
var collection: string;
// A lot of code here really, but it basically results in something like this:
return this.query = this.afs.collection<DataItem>('CollectionName', ref => ref.where('datetime', '>=', '2020-01-15T09:51:00.000Z').orderBy('datetime', 'desc').limit(100));
}
async downloadCsv(value) {
this.query = this.makeQuery(value);
this.dataForDownload = await this.getDataForDownload();
this.dataForDownload = JSON.stringify(this.dataForDownload['data']);
console.log('Data: ', this.dataForDownload);
var date = new Date();
var date_str = this.datePipe.transform(date, 'yyyy-MM-ddTHH-mm');
this.makeFileService.downloadFile(this.dataForDownload, 'data-' + date_str);
}
async getDataForDownload() {
return this.query.get()
.then(function (querySnapshot) {
var jsonStr = '{"data":[]}';
var dataObj = JSON.parse(jsonStr); //making object we can push to
querySnapshot.forEach(function (doc) {
//console.log('Data for download: ', JSON.stringify(doc.data()), ', id: ', doc.id);
dataObj['data'].push(doc.data());
});
console.log('The returned dataObj is: ', dataObj);
return dataObj;
})
.catch(function (error) {
console.log("Error getting documents: ", error);
});
}
async getRealTimeData(value) {
this.query = await this.makeQuery(value);
this.data = this.query.valueChanges();
}
Я думаю, что с помощью Rx JS операторы типа map()
и, возможно, take(1)
на valueChanges()
(в трубе) будут работать, но я не понимаю, как это должно быть сделано. Как и в приведенном выше коде (getDataForDownload()
), мне нужно поместить объекты sh в объект JSON, чтобы его можно было загрузить.
Результат, который я (хочу) получить, - это один (или, как правило, много) объектов, например: {отметка времени: XXX, ID: XXX, температура: XXX}, откуда данные должны быть перечислены в CSV-файл с одним объектом в каждой строке.