带有嵌套Firebase查询的For循环Javascript
我有一个包含用户列表的节点和第二个包含每个用户评级信息的节点。 我希望在第一个节点的用户中循环,并从第二个节点获得每个节点的评级。问题是循环不会等待第二个节点给出答案,因此返回的数组总是空的。 我知道我需要使用wait/async方法,但它不起作用。 谢谢你的帮助带有嵌套Firebase查询的For循环Javascript,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我有一个包含用户列表的节点和第二个包含每个用户评级信息的节点。 我希望在第一个节点的用户中循环,并从第二个节点获得每个节点的评级。问题是循环不会等待第二个节点给出答案,因此返回的数组总是空的。 我知道我需要使用wait/async方法,但它不起作用。 谢谢你的帮助 return admin.database().ref('/user').once('value').then(async(snap) => { for(const userId of snap) { admin.dat
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);
});
您需要使用,如下所示(未经测试):
正如
Promise.all()
doc中所解释的,“返回的值将按照传递的承诺的顺序排列,而不管完成顺序如何”。因此,对于userid
和snap2
数组,它们的元素顺序是对应的:因此可以执行array.push([userid[idx],rating])代码>谢谢你的工作!使用async/await是否可以获得相同的结果?是的,这是可能的,但是使用async/await
和forEach
并不简单,请参阅。
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) => {
//...
});