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() {
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); }
heinob
source share