Firestore Observables:尝试合并来自CombineLatest()

时间:2018-08-29 20:30:46

标签: angular google-cloud-firestore

因此,有些情况下我试图从Firestore数据库中的多个不同表中提取数据。我已经用Firebase实时数据库完成了这种事情,但是我认为我在这里做错了,或者我错过了一些。

我有一个函数,该函数运行多个分层的combineLatestswitchMap函数来抓取数据并将其一直返回给该函数的原始调用方,如下所示:

/**
   *  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 :(得分:0)

您可以通过管道将“合并”运算符与观察者进行管道连接,以附加数据。如果要附加的数据也是可观察的,那么真的很简单,只需管道传输新的可观察对象并返回可观察对象即可。否则,如果它是静态数据或来自其他来源,请首先使用“ of”运算符将其转换为可观察值,然后将其传递给所需的可观察值。

        private const int SW_SHOWNORMAL =1; 

        Process[] processes = Process.GetProcessesByName(ProcessName);

        int nProcessID = Process.GetCurrentProcess().Id;

        foreach (Process p in processes)
        {
            if (nProcessID != p.Id)
            {
                p.Refresh();
                ShowWindow(p.MainWindowHandle, SW_SHOWNORMAL);

                SetForegroundWindow(p.MainWindowHandle);
            }
        }