我正在使用 Firebase Cloud Firestore,但是,我认为这可能更多是 JavaScript 异步与同步承诺返回问题。
我正在执行一个查询以从一个集合中获取 ID,然后循环遍历该查询的结果以根据该 ID 从另一个集合中查找单个记录。
然后我想将每条找到的记录存储到一个数组中,然后返回整个数组。
results.length
始终为 0,因为 return results
在 forEach 完成之前触发。如果我从 forEach 内部打印 results.length
它有数据。
在从外部承诺和外部函数本身返回之前,我如何才能等到 forEach 完成?
getFacultyFavoritesFirebase() {
var dbRef = db.collection("users").doc(global.user_id).collection("favorites");
var dbQuery = dbRef.where("type", "==", "faculty");
var dbPromise = dbQuery.get();
var results = [];
return dbPromise.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
var docRef = db.collection("faculty").doc(doc.id);
docRef.get().then(function(doc) {
if (doc.exists) {
results.push(doc);
}
})
});
console.log(results.length);
return results;
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
原文由 AdamG 发布,翻译遵循 CC BY-SA 4.0 许可协议
这里的技巧是用承诺而不是结果来填充
results
。然后,您可以对该承诺数组调用Promise.all()
并获得所需的结果。当然,您无法在推送承诺之前检查doc.exists
,因此您需要处理一次Promise.all()
解决。例如: