La variable Javascript es una matriz de objects pero no puede acceder a los elementos

Estoy usando la database de Firebase y Javascript, y tengo un código que obtendrá cada pregunta en cada categoría. Tengo un object llamado categoría que contendrá el nombre, las preguntas y el recuento de preguntas, luego se includeá en la list de categorías (questionsPerCategory). Dentro de la function de callback, simplemente hago console.log(questionsPerCategory) . Imprime el object (matriz) que contiene las categorías y preguntas. Ahora mi problema es que cuando lo hago console.log(questionsPerCategory[0]) dice que no está definido , también probé console.log(questionsPerCategory.pop()) ya que es una matriz pero tampoco está definida . ¿Porqué es eso? A continuación se muestra el código y la image del logging de la console. Nota adicional: los códigos A y C son asíncronos, los códigos B y D son sincrónicos.

enter image description here

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

La callback(questionsPerCategory); debería ocurrir cuando todas las llamadas asincrónicas hayan finalizado.

En este momento, la questionsPerCategory no está list cuando se llama a la devolución de llamada. Yo usaría Promise API para lograr esto.

Dependiendo de la biblioteca Promise que esté utilizando, esto se puede lograr de diferentes maneras, por ejemplo, al usar bluebird , parece que necesita una funcionalidad de map .

Prueba este código:

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