Итак, у меня возникла ситуация, когда я пытаюсь получить данные из нескольких разных таблиц в моей базе данных 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()
, что у меня есть в другом компоненте ,
Есть ли способ, которым я могу взять данные из этих данных самого глубокого уровня и добавить их к объекту, который содержит данные сверху в функции, которую я затем могу вернуть вызывающей функции? Я понимаю, что это немного сложный запрос, который я пытаюсь собрать вместе, но есть ли что-то, что можно сделать?