Nodo mongoose buscar consulta en el bucle no funciona

Estoy tratando de recuperar los registros de la mongoose en bucle. Pero no está funcionando como se esperaba. Tengo una variedad de hashes con preguntas y respuestas y estoy tratando de encontrar esas preguntas de mi db. Aquí está mi bucle:

for (var i=0;i < answers.length;i++) { console.log(i) var question_ans = eval('(' + answers[i]+ ')'); var question_to_find = question_ans.question.toString() var ans = question_ans.ans.toString() console.log(ans) quiz.where("question",question_to_find).exec(function(err,results) { console.log(results) if (ans == "t") { user_type = results.t } else if (ans == "f") { user_type=results.f } }) } 

y el resultado del terminal es algo como:

 0 t 1 f [ { question: 'i was here', _id: 5301da79e8e45c8e1e7027b0, __v: 0, f: [ 'E', 'N', 'F' ], t: [ 'E', 'N', 'F' ] } ] [ { question: 'WHo ru ', _id: 5301c6db22618cbc1602afc3, __v: 0, f: [ 'E', 'N', 'F' ], t: [ 'E', 'N', 'F' ] } ] 

El problema es que mis preguntas se muestran después de la iteración del bucle. Y por eso no puedo procesarlos.

¡Por favor ayuda! Saludos

Bienvenido a async-land 🙂

Con JavaScript todo sucede en paralelo excepto tu código. Esto significa que en su caso específico, las devoluciones de llamada no se pueden invocar antes de que su bucle haya finalizado. Tienes dos opciones:

a) Reescriba su bucle desde un bucle for-sync a un ciclo de repetición asíncrono:

 function asyncLoop( i, callback ) { if( i < answers.length ) { console.log(i) var question_ans = eval('(' + answers[i]+ ')'); var question_to_find = question_ans.question.toString() var ans = question_ans.ans.toString() console.log(ans) quiz.where("question",question_to_find).exec(function(err,results) { console.log(ans, results) if (ans == "t") { user_type = results.t } else if (ans == "f") { user_type=results.f } asyncLoop( i+1, callback ); }) } else { callback(); } } asyncLoop( 0, function() { // put the code that should happen after the loop here }); 

Adicionalmente te recomiendo el estudio de este blog . Contiene dos escalones más por la escalera asíncrona. Muy útil y muy importante.

b) Ponga su llamada de función asíncrona en un cierre con formato

 (function( ans ) {})(ans); 

y proporcione la variable que desea conservar (aquí: ans ):

 for (var i=0;i < answers.length;i++) { console.log(i) var question_ans = eval('(' + answers[i]+ ')'); var question_to_find = question_ans.question.toString() var ans = question_ans.ans.toString() console.log(ans) (function( ans ) { quiz.where("question",question_to_find).exec(function(err,results) { console.log(ans, results) if (ans == "t") { user_type = results.t } else if (ans == "f") { user_type=results.f } }) })(ans); }