Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript变量是一个对象数组,但可以';我无法访问元素_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript变量是一个对象数组,但可以';我无法访问元素

Javascript变量是一个对象数组,但可以';我无法访问元素,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我使用的是Firebase数据库和Javascript,我有代码可以获取每个类别中的每个问题。我有一个名为category的对象将包含名称、问题和问题计数,然后它将被推送到类别列表(questionsPerCategory)中。在回调函数中,我只需执行console.log(questionsPerCategory)。它打印包含类别和问题的对象(数组)。现在我的问题是,当我做console.log(questionsPerCategory[0])时,我说它是未定义的,我也尝试了console.l

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

请尝试以下代码:

this.getQuestionsForEachCategory = function(callback, questions) {
var ref = firebase.database().ref('category');
var questionRef = firebase.database().ref('question');
console.log('get questions for each category');
var questionsPerCategory = [];
// 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); 
    });
});
};
回调(问题分类)应该在所有异步调用完成时发生

现在调用回调时,
questionsPerCategory
尚未就绪。 我将使用
Promise API
来实现这一点


根据您正在使用的
Promise
库的不同,这可以通过不同的方式来实现,例如,通过使用它,看起来您需要功能。

您可以设置一个JSFIDLE/jsbin来再现最小问题吗?您可以在放置“console.log(questionsPerCategory[0])的地方显示回调函数吗?这是由于异步调用造成的。你必须检查下面的链接@乔伊·米蒂这真的只是个安慰log@ti2005您在那里提供的代码是否使用下划线.js?我搜索了vCategories(recvCategories)和vCategories.filter,发现它可能是underline.js。你说“未准备好”是什么意思?那么回调必须在ref.one(..)之后发生?不管怎样,我用了一个承诺,它现在起作用了。(我用angularjs表示承诺)谢谢!
this.getQuestionsForEachCategory = function(callback, questions) {
var ref = firebase.database().ref('category');
var questionRef = firebase.database().ref('question');
console.log('get questions for each category');
var questionsPerCategory = [];
// 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); 
    });
});
};