【发布时间】:2017-06-22 14:10:49
【问题描述】:
我正在尝试遍历 Firebase 列表(使用 AngularFire2),并且我想获得一个 Promise 来指示嵌套循环何时完成,以便我可以处理第二个操作。我正在使用以下代码:
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')
});
输出是:
但是我只在外循环之后才得到 Promise,而不是等待嵌套循环完成。有什么建议吗?
【问题讨论】:
-
如果您使用
.map()循环创建多个承诺,那么您将需要使用Promise.all()来等待它们。Promise.all()创建一个等待一系列承诺的承诺(您可以返回)。 -
把 Promise.all() 放在哪里!?
-
我不知道你的数据库接口,但大概
this.af.database.list()是异步的,你需要从中得到一个承诺并从你的.map()返回它。这意味着.map()将产生一个promise 数组,您需要在promise 数组上使用Promise.all(),这样您就可以返回Promise.all()创建的单个主promise。 -
你能举个例子吗?我在使用 promises 数组之前尝试过,但也没有用
-
对不起,但我不明白您的数据库如何产生承诺给您一个具体的例子。您可以在 MDN 和网络上的许多其他地方阅读有关
Promise.all()的信息。这个概念是你使用类似.map()的东西来产生一个promise数组,然后你在那个promise数组上调用Promise.all(),等待它们全部完成并将所有结果收集到一个数组中。
标签: typescript firebase promise firebase-realtime-database angularfire2