Добре дошли в async-land :-)
С JavaScript всичко се случва паралелно, освен вашия код. Това означава във вашия конкретен случай, че обратните извиквания не могат да бъдат извикани, преди вашият цикъл да е приключил. Имате две опции:
a) Пренапишете своя цикъл от синхронизиращ for-цикл към асинхронен рекурсивен цикъл:
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
});
Освен това препоръчвам изучаването на този блог. Той съдържа две допълнителни стъпки нагоре по стълбата на асинхронния цикъл. Много полезно и много важно.
b) Поставете извикването на вашата асинхронна функция в затваряне с формат
(function( ans ) {})(ans);
и му предоставете променливата, която искате да запазите (тук: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);
}