2014-10-31 2 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]); 
    } 
}); 

당신이 비동기 코드와 클로저 루프를 사용하면 비동기 코드가 실행되기 전에 폐쇄가 (내가 변화의 값을) 진행 될 수 있도록, 그것은 가능합니다. 즉, 잘못된 요소 또는 잘못된 요소에 모두 액세스 할 수 있습니다. 자체 닫기 함수에서 async 함수를 래핑하면 래핑 된 함수에서 올바른 항목을 사용할 수 있습니다.

+0

훌륭함 - 완벽하고 완벽하게 작동합니다. 이것에 대해 고마워. 많이 배우기! –

관련 문제