Как использовать valueChanges () вместо get () для загрузки данных со строкой JSON? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть форма с двумя разными кнопками: одна для загрузки данных (из 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-файл с одним объектом в каждой строке.

...