我有一个包含用户列表的节点,还有一个包含每个用户的评分信息的第二节点。我想在第一个节点的用户中循环,并为每个用户从第二个节点获取评分。问题在于循环不等待第二个节点给出答案,因此返回的数组始终为空。我知道我需要使用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);
});
您需要使用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