2014-03-26 2 views
1

this question과 동일한 문제가 있지만 해결할 솔루션이 없습니다. mongo에서 캐시 된 값을 먼저 확인하는 nodejs 스크립트를 작성하려고하지만, 존재하지 않는 경우이를 제거하고 계산합니다. 문제는 findOne() 콜백이 루프 변수의 원래 값을 가져 오지 않아 콜백이 올바르게 계산되어 값을 저장할 수 없기 때문입니다. (실제 가져 오기, 저장 및 실제 문제에 집중하기 위해 생략했습니다.). 내가하는 일이 무엇이든간에 원래 값을 콜백에 넣을 수 있습니다.변수의 현재 값을 비동기 콜백에 보내는 방법

for (var d=start_date; d<now; d.setHours(d.getHours()+1)) { 
      (function(key) { 
      console.log('caller='+key) 

      db.collection('avgs').findOne({ date: key.toISOString() },function (err,data) { 
      console.log('callback='+key); 
      if (data) { //return data } 
      else { // compute average for given date , insert into database and return value } 
      }); 
      })(d); 
     }; 

콘솔 로그 내가 문제를 추측하고있어이

caller=Tue Mar 25 2014 00:00:00 GMT+1030 (CST) 
caller=Tue Mar 25 2014 01:00:00 GMT+1030 (CST) 
caller=Tue Mar 25 2014 02:00:00 GMT+1030 (CST) 
caller=Tue Mar 25 2014 03:00:00 GMT+1030 (CST) 
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST) 
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST) 
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST) 
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST) 

답변

3

당신은, 랩 된 함수의 값 d를 전송하고, 그 함수 내에서 어떤 방법으로 그 값을 수정하고 있음을 보여줍니다 . d은 루프 반복기에 대한 참조이므로이를 수정하면 루프가 수정됩니다.

for (var d=start_date; d<now; d.setHours(d.getHours()+1)) { 
     (function(_key) { 
     // Make a copy of the object you passed in, so that modifying it 
     // won't screw up your loop 
     var key = new Date(_key); 
     console.log('caller='+key) 

     db.collection('avgs').findOne({ date: key.toISOString() },function (err,data) { 
     console.log('callback='+key); 
     if (data) { //return data } 
     else { // compute average for given date , insert into database and return value } 
     }); 
     })(d); 
    }; 
+0

와우하지만 값이 아닌 참조를 전달하는 등장! 이 솔루션을 정말 좋아했습니다. – Sethunath

0

내가 같은를 얻기 위해 바인드()를 사용 할 수 있었다 발견 루프 변수의 복사본을 생성하는 기술을 사용 :이 솔루션은 함수 내부의 객체의 사본을 생성하는 것입니다 결과. 같은 결과이지만 코드가 내 눈을 잘 읽습니다.

db.collection('avgs').findOne({ date: key.toISOString() },found.bind(this,new Date(d)); 

function found(key,err,data) { 
console.log('callback='+key); 
if (data) { //return data } 
else { // compute average for given date , insert into database and return 
}; 

자바 스크립트는 일반적으로 not always

관련 문제