Node mongoose search query in loop not working

I am trying to get records from mongoose in a loop. But it does not work as expected. I have an hash array with questions and answers, and I'm trying to find these questions from my db. Here is my loop:

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

and the result from the terminal is something like:

 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' ] } ] 

The problem is that my questions are displayed after the loop iteration. And because of this, I can’t process them.

Please, help! Relationship

+7
mongodb mongoose
source share
1 answer

Welcome to async-land :-)

With JavaScript, everything happens in parallel except your code. This means that in your particular case, callbacks cannot be called before your loop completes. You have two options:

a) Rewrite your loop from sync for-loop to async recurse-loop:

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

In addition, I recommend exploring this blog . It contains two more steps up the stairs with an asynchronous circuit. Very helpful and very important.

b) Put function call of asynchronous function in close with format

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

and provide it with the variable you want to save (here: 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); } 
+16
source share

All Articles