2014-10-31 53 views
0

爲什麼在第二個查詢中導致該字段未定義?代碼如下:在查詢中訪問查詢中的MongoDB值

Survey.findById(req.params.id, function(err, survey) { 

     for (var i=0; i<=survey.businesses.length-1; i++) { 

      console.log(survey.businesses[i].votes); // This returns the expected value 

      UserSurvey.find({ surveyId: req.params.id, selections: survey.businesses[i].id }, function(err, usurvey) { 

       console.log(survey.businesses[i].votes); // businesses[i] is undefined 

      }); 
     } 

}); 

回答

1

您的方法有幾個問題。我建議做這樣的事情,而不是:

Survey.findById(req.params.id, function(err, survey) { 
    for (var i=0; i<=survey.businesses.length-1; i++) { 
     (function(business) { 
      console.log(business); // This returns the expected value 
      UserSurvey.find({ surveyId: req.params.id, selections: business.id }, function(err, usurvey) { 
       console.log(business.votes); // businesses[i] is undefined 
      }); 
     })(survey.businesses[i]); 
    } 
}); 

當您使用異步代碼和一個封閉的循環,它可能被提前關閉(我改變的值)運行的異步代碼之前。這意味着您可能正在訪問錯誤的元素或完全無效的元素。將自動關閉功能中的異步功能包裝在一起,可確保包裝功能使用正確的項目。

+0

優秀 - 理智和完美。非常感謝。很多要學習! – 2014-10-31 20:10:11