Observables Firestore: Попытка объединить данные, которые поступают с нескольких уровней, в CombineLatest () - PullRequest
0 голосов
/ 29 августа 2018

Итак, у меня возникла ситуация, когда я пытаюсь получить данные из нескольких разных таблиц в моей базе данных Firestore. Я делал подобные вещи с базой данных Firebase в реальном времени, однако я думаю, что здесь что-то не так, или я что-то упускаю.

У меня есть функция, которая запускает ряд многоуровневых функций combineLatest и switchMap, чтобы захватывать данные и возвращать их полностью исходному вызывающему функции, например:

/**
   *  Get the groupings and then get the mapping data for each
   */
  getGroupingsData(userId, businessAccountId, duration) {

    // User's access token
    let at = localStorage.getItem('access_token');

    return Observable.combineLatest(
      Observable.fromPromise(this.getPagesForUser()),
      this.getGroupingsForUserAndAccount(userId, businessAccountId)
    ).switchMap(results => {

      let fbPages = results[0].data;
      let groupings = results[1];

      // Let's iterate through each mapping
      return Observable.combineLatest(
        groupings.map(grouping => {
          let group = grouping.payload.doc.data();
          return Observable.combineLatest(
            group.mappings.map(mapping => {
              return this.getMappingData(mapping.id).switchMap(data => {
                let mapData = data.payload.data();
                let pageAccessToken = '';

                // Loop through pages and see if one can find a matching fb ID
                fbPages.forEach(page => {

                  // We have a match, add the page access token to the mapping
                  if(page.id === mapData.page.id) {
                    pageAccessToken = page.access_token;
                  }
                });

                // Get the data for the duration
                return Observable.combineLatest(
                  this.getFacebookAdAccountStats(mapData.ad_account.id),
                  Observable.fromPromise(this.getInsightsForPage(mapData.page.id, pageAccessToken, duration))
                )
                .switchMap(theData => {
                  let adAccountStatsData = theData[0];
                  let fbPageInsightsData = theData[1];
                  let mappingAdData = {
                    ad_account: {
                      insights: {}
                    },
                    page: {}
                  }
                  mappingAdData['ad_account']['insights'] = adAccountStatsData;
                  mappingAdData['page']['insights'] = {
                    reach_total_paid: fbPageInsightsData[0].data[0].values[1].value,
                    reach_total_organic: fbPageInsightsData[1].data[0].values[1].value,
                    impressions_total_paid: fbPageInsightsData[2].data[0].values[1].value,
                    impressions_total_organic: fbPageInsightsData[3].data[0].values[1].value,
                    engaged_users_total: fbPageInsightsData[4].data[0].values[1].value,
                  };

                  return Observable.of(mappingAdData);
                })
              })
            })
          )
        })
      )
    })
  }

В этом конкретном примере данные из самой глубокой вложенной функции combineLatest() правильно всплывают, однако есть некоторые данные, которые я хочу прикрепить к ней, прежде чем она достигнет .subscribe(), что у меня есть в другом компоненте ,

Есть ли способ, которым я могу взять данные из этих данных самого глубокого уровня и добавить их к объекту, который содержит данные сверху в функции, которую я затем могу вернуть вызывающей функции? Я понимаю, что это немного сложный запрос, который я пытаюсь собрать вместе, но есть ли что-то, что можно сделать?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете передать оператор «слияния» с наблюдателем, чтобы прикрепить данные. Если присоединяемые данные также являются наблюдаемыми, то на самом деле просто просто передать новую наблюдаемую и вернуть наблюдаемую. В противном случае, если это статические данные или из какого-либо другого источника, сначала преобразуйте их в наблюдаемую с помощью оператора «of», а затем передайте по конвейеру желаемую наблюдаемую.

result$ = first$.pipe(merge(second$))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...