gpt4 book ai didi

javascript - 在从我的 promise /功能返回之前等待 forEach 完成

转载 作者:数据小太阳 更新时间:2023-10-29 04:35:59 26 4
gpt4 key购买 nike

我正在使用 Firebase Cloud Firestore,但是,我认为这可能更多是 JavaScript 异步与同步 promise 返回问题。

我正在执行一个查询以从一个集合中获取 ID,然后循环遍历该查询的结果以根据该 ID 从另一个集合中查找单个记录。

然后我想将找到的每条记录存储到一个数组中,然后返回整个数组。

results.length 始终为 0,因为 return results 在 forEach 完成之前触发。如果我从 forEach 内部打印 results.length 它有数据。

我如何才能等到 forEach 完成后再从外部 promise 和外部函数本身返回?

         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);
});
}

最佳答案

这里的技巧是用 promise 而不是结果来填充results。然后,您可以对该 promise 数组调用 Promise.all() 并获得您想要的结果。当然,您无法在推送 promise 之前检查 doc.exists 是否存在,因此您需要在 Promise.all() 解析后处理该问题。例如:

function getFacultyFavoritesFirebase() {
var dbRef = db.collection("users").doc(global.user_id).collection("favorites");
var dbQuery = dbRef.where("type", "==", "faculty");
var dbPromise = dbQuery.get();
// return the main promise
return dbPromise.then(function(querySnapshot) {
var results = [];
querySnapshot.forEach(function(doc) {
var docRef = db.collection("faculty").doc(doc.id);
// push promise from get into results
results.push(docRef.get())
});
// dbPromise.then() resolves to a single promise that resolves
// once all results have resolved
return Promise.all(results)
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}

getFacultyFavoritesFirebase
.then(results => {
// use results array here and check for .exists
}

关于javascript - 在从我的 promise /功能返回之前等待 forEach 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com