我实际上是在一个 Javascript 项目中使用 Firebase,并试图获取集合中所有元素的嵌套子元素的信息。
由于我需要递归触发数据库,因此我正在尝试创建一个自调用递归方法,该方法将映射实际的数据库模式并提取所需的数据。
为了这篇文章的目的,我创建了一个假方法来展示我的实际逻辑。也许有人可以帮助我,这是一个永无止境的循环,无限触发最后一项。它从不存储第一个结果
function fakeWait(toReturn) {
return new Promise((resolve) => {
setTimeout(function(){ resolve(toReturn); }, 8000);
});
}
function callMe(params = null) {
return new Promise((resolve, reject) => {
console.log('Promise called', {...params});
const promises = [];
if (params === null) {
promises.push(fakeWait(
{
id1:{title:'Title1'},
id2:{title:'Title2'},
id3:{title:'Title3'},
id4:{title:'Title4'},
}).then(results => {
params = {};
params.formations = results;
resolve(callMe(params));
}));
}
else {
if (!params.hasOwnProperty('formationId') &&
params.hasOwnProperty('formations')) {
Object.keys(params.formations).forEach(formationId => {
params.formationId = formationId;
promises.push(resolve(callMe(params)));
});
}
else if (params.hasOwnProperty('formationId') &&
params.hasOwnProperty('formations') &&
!params.formations[params.formationId].hasOwnProperty.modules)
{
promises.push(fakeWait({
id1:{title:'Title1.1'},
id2:{title:'Title1.2'},
id3:{title:'Title1.3'},
id4:{title:'Title1.4'},
}).then(result => {
params.formations[params.formationId].modules = result;
resolve(callMe(params));
}))
}
}
Promise.all(promises).then(() => { console.log('Resolved.'); resolve(params); }).catch(()=> reject('oops'));
});
}
callMe().then(results =>console.log(results)).catch(msg => console.log(msg));
您还可以在此处查看和尝试 stackblitz 上的代码:https ://stackblitz.com/edit/js-wuvp9z
Firebase 数据结构:
Formations - Collection
- Formation - Document
-- Modules - Collection
--- Module - Document
---- Chapters - Collection
----- Chapter - Document
------ Screens - Collection
------- Screen - Document