我正在使用 Firebase 数据库和 Javascript,并且我有代码可以获取每个类别中的每个问题。我有一个名为 category 的对象将包含名称、问题和问题计数,然后它将被推送到类别列表 (questionsPerCategory) 中。在回调函数中,我只执行 console.log(questionsPerCategory) 。它打印包含类别和问题的对象(数组)。现在我的问题是,当我执行 console.log(questionsPerCategory[0]) 时说它未定义,我也尝试了 console.log(questionsPerCategory.pop()) 因为它是一个数组但它也是未定义的。这是为什么?下面是控制台日志的代码和图像。附加说明:CODE A 和 C 是异步的,CODE B 和 D 是同步的。

Javascript变量是一个对象数组但无法访问元素-LMLPHP

this.getQuestionsForEachCategory = function(callback, questions, questionsPerCategory) {
    var ref = firebase.database().ref('category');
    var questionRef = firebase.database().ref('question');
    console.log('get questions for each category');

    // CODE A
    ref.once("value", function(snapshot) {

        // CODE B
        snapshot.forEach(function(childSnapshot) {
            var key = childSnapshot.key;

            var childData = childSnapshot.val();

            var category = {
                category_name: childData.category_name
            };

            // CODE C
            questionRef.orderByChild("category_name").equalTo(childData.category_name).once("value", function(questionSnapshot){
                var count = 0;
                var q = [];

                // CODE D
                questionSnapshot.forEach(function(childQuestionSnapshot) {
                    var questionObj = childQuestionSnapshot.val();
                    count++;

                    questions.push(questionObj.question);
                    q.push(questionObj.question);
                });

                category.questions = q;
                category.questionCount = count;
                questionsPerCategory.push(category);

            });

        });
        callback(questionsPerCategory);

    });
};

最佳答案

callback(questionsPerCategory); 应该在所有异步调用完成后发生。

现在,调用回调时 questionsPerCategory 还没有准备好。
我会使用 Promise API 来完成这个。

根据您使用的 Promise 库,这可以通过不同的方式完成,例如通过使用 bluebird 看起来您需要 map 功能。

关于Javascript变量是一个对象数组但无法访问元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39119658/

10-10 13:48