我有一个对象:
这是我用来遍历对象的函数:
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”的数组。
请帮我优化我的代码。现在它返回一个空数组。
问题是您在解决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 => {})
,其中标记应该是一组id。