我有一个对象:
这是我用来遍历对象的函数:
function getAllUsersKeys(user){
var promise = new Promise((resolve, reject) => {
var tokens = []
user.forEach(function(user) {
admin.database().ref(`/FAVORITES/${user.key}`).orderByKey().once('value').then((favShops) => {
favShops.forEach((shop)=>{
if(shop.key==saledata.store_id){ //if store that activated sale if found under users list under /FAVORITES
admin.database().ref(`/FAVORITES/${user.key}/token`).orderByKey().once('value').then((token) => {
//console.log(token.val().id);
tokens.push(token.val().id);
})
}
})
})
})
resolve(tokens);
})
return promise;
}
控制台消息将在所选令牌下打印出“id”。
//console.log(token.val().id);
但是当我将这个“id”推入名为 tokens 的数组时,没有任何内容出现。
tokens.push(token.val().id);
基本上我想要这个方法做的是返回一个具有选定数量“id”的数组。
请帮我优化我的代码。现在它返回一个空数组。
答案 0 :(得分:1)
问题是您在解决firebase承诺之前解决了getAllUserKeys的承诺。您的console.log工作原因是因为它等待您在记录之前完成firebase查找。当你resolve(tokens)
时,填补该数组的承诺尚未得到解决。
您需要确保在resolve(tokens)
之前解决了所有firebase承诺。
更新:
我不能轻易测试,所以它可能不会先尝试。
function getAllUserKeys(user) {
return Promise.all(user.map(user => {
return admin.database().ref(`/FAVORITES/${user.key}`).orderByKey().once('value');
})).then(favShops => {
return Promise.all(favShops.filter(shop => {
if(shop.key === saledata.store_id) {
return admin.database().ref(`/FAVORITES/${user.key}/token`).orderByKey().once('value');
}
return false;
}))
}).then(tokens => {
return tokens.map(token.val().id);
})
}
这是一个如何链接承诺的例子。
then
方法中,您将获得promise all的结果,该结果应该是favShops数组。 getAllUserKeys().then(tokens => {})
,其中标记应为ids数组。