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

标签 javascript node.js firebase google-cloud-firestore

我正在使用 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/

相关文章:

javascript - 使用草兰的异步模块返回一个值

android - Firebase 函数在 10 秒后在客户端超时

firebase - 如何使用 Firebase 安全规则验证此数据结构?

javascript - JSON 元素选择

javascript - 使用 requirejs 的 Angular Material 设计单元测试 angularjs 指令会引发 "GET"错误

node.js - 如何在 keycloak 中验证 token 并获取用户详细信息?

javascript - 使用用户 ID 将数据添加到 Firestore

javascript - 为什么我的 bootstrap 3.7 轮播不工作?

javascript - 在 Angular JS 中使用 HTML 选择

node.js - Nodejs - 如何设置 cron 作业每 2 个星期日运行一次