2014-02-17 90 views
7

我想在循環來從貓鼬記錄。但它沒有按預期工作。我有一系列的問題和答案哈希,我試圖從我的數據庫中找到這些問題。下面是我的循環:節點貓鼬發現循環查詢不能

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

,並從終端的結果是這樣的:

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

的問題是,我的問題是循環的迭代後顯示。正因爲如此,我無法處理它們。

請幫忙! 問候

回答

16

歡迎異步土地:-)

使用JavaScript有什麼事情發生在並行除了你的代碼。這意味着在您的特定情況下,在循環結束之前無法調用回調。你有兩個選擇:

一)從循環同步到異步遞歸循環重寫你的循環:

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

此外,我建議的this blog研究。它包含異步循環樓梯的另外兩個步驟。非常有幫助,非常重要。

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

感謝heinob它幫助。再次 – nOmi

+0

感謝遞歸循環。它會幫助我更好地理解。 – nOmi