Chào mừng đến với async-land :-)
Với JavaScript, mọi thứ đều xảy ra song song ngoại trừ mã của bạn. Điều này có nghĩa là trong trường hợp cụ thể của bạn, rằng các lệnh gọi lại không thể được gọi trước khi vòng lặp của bạn kết thúc. Bạn có hai lựa chọn:
a) Viết lại vòng lặp của bạn từ vòng lặp for đồng bộ thành vòng lặp đệ quy không đồng bộ:
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
});
Ngoài ra, tôi khuyên bạn nên nghiên cứu blog này. Nó bao gồm hai bước tiếp theo lên cầu thang không đồng bộ. Rất hữu ích và rất quan trọng.
b) Đặt lệnh gọi hàm không đồng bộ của bạn thành một lệnh đóng với định dạng
(function( ans ) {})(ans);
và cung cấp cho nó biến mà bạn muốn giữ lại (tại đây: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);
}