For循环与嵌套Firebase查询Javascript

问题描述 投票:0回答:1

我有一个包含用户列表的节点,还有一个包含每个用户的评分信息的第二节点。我想在第一个节点的用户中循环,并为每个用户从第二个节点获取评分。问题在于循环不等待第二个节点给出答案,因此返回的数组始终为空。我知道我需要使用await / async方法,但是它不起作用。感谢您的帮助

return admin.database().ref('/user').once('value').then(async(snap) => {
for(const userId of snap) {
    admin.database().ref('/rating/' + userId.key).once('value').then(await (snap) =>{
        var rating = snap.val();
        array.push([userId.key, rating]);
    }).catch(error => {
        console.log("failed 1 " + error.code);
    });
}
return array;
}).catch(error => {
console.log("failed 2 " + error.code);
});
javascript firebase for-loop async-await nested
1个回答
0
投票

您需要使用Promise.all(),如下(未试用):

Promise.all()

const array = []; const userIds = []; return admin .database() .ref('/user') .once('value') .then((snap1) => { const promises = []; snap1.forEach((childSnapshot1) => { promises.push( admin .database() .ref('/rating/' + childSnapshot1.key) .once('value') ); userIds.push(childSnapshot1.key); }); return Promise.all(promises); }) .then((snap2) => { snap2.forEach((childSnapshot2, idx) => { const rating = childSnapshot2.val(); array.push([userIds[idx], rating]); }); return array; }) .catch((error) => { //... }); 文档中所述,“返回值将按照传递的承诺的顺序进行,而不考虑完成顺序”。因此,Promise.all()userIds的顺序是对应的:因此可以执行snap2

© www.soinside.com 2019 - 2024. All rights reserved.