Я пытаюсь пропустить список Firebase (используя AngularFire2), и я хочу получить Promise, чтобы указать, когда завершились вложенные циклы, чтобы я мог обработать второе действие. Я использую следующий код:Получение обещания из вложенного цикла forEach?
console.log('START');
this.af.database.list('Sites/123123/Users')
.map(users => {
users.map(user => {
console.log('found a user ', user);
this.af.database.list('registeredUsers/' + user.$key + '/Sites')
.forEach(sites => {
sites.forEach(site => {
if (site.$value == '123123') {
console.log('found site ', site.$key);
}
});
});
});
}).first().toPromise().then(function (x) {
console.log('ALL DONE')
});
Выход:
Но я получаю обещание только после внешнего цикла, не дожидаясь вложенного цикла, чтобы закончить. Какие-либо предложения?
Если вы создаете несколько обещаний с вашей '.map()' петли, то вам нужно будет использовать 'Promise.all()' ждать их. 'Promise.all()' создает единственное обещание (которое вы можете вернуть), которое ждет массив обещаний. – jfriend00
где поставить Promise.all()!? – devMan
Я не знаю вашего интерфейса с базой данных, но предположительно 'this.af.database.list()' является асинхронным, и вам нужно получить от него обещание и вернуть его из '.map()'. Это означает, что '.map()' будет генерировать массив обещаний, которые вам нужно использовать 'Promise.all()' в массиве обещаний, чтобы вы могли вернуть единственное обещание, которое создает 'Promise.all()'. – jfriend00