2011-09-01 8 views
1

Node.js 응용 프로그램을 사용하여 변수 범위를 설정하는 데 문제가 있습니다. 일반적으로 함수 내에서 변수 범위가 작동하는 방식을 알고 있습니다 (이 경우 익명 콜백 함수).자바 스크립트에서 변수 범위를 통해 변수 유지하기

내가 싸우고있는 것은 익명 콜백의 체인/구멍을 통해 vairables를 유지하는 가장 좋은 방법은입니다. 일반적으로 함수에 변수를 전달할 수 있지만 mongoose (mongodb ORM)를 사용하기 때문에 직접 변수를 전달할 수 없으므로 각 단계에서 변수를 반복해서 정의해야합니다. 콜백.

가장 좋은 방법은 무엇입니까? 다음은

가 나는 트위 팅을 위해 그들을 사용할 시간에 의해 정의되지 않은 받고 변수를 결국 내 코드입니다 :

var userBid = tag.user; 

User.find({id: userAid}, function(err, userA){ 

    if (err) {console.log("Error getting user A for tweeting ", err)} 
    else { 
    var userAName = userA.twitter.screenName; 
    var userBid2 = userBid; 
    User.find({id: userBid2}, function(err, userB){ 

     if (err) {console.log("Error getting user B for tweeting ", err)} 
     else { 

     var action = "@"+ userAName + " just claimed some of @" + userB.twitter.screenName + " 's turf as their own."; 

     twitterClient.updateStatus(action, function(err, resp){ 
      if (!err) { 
      console.log("Tweeted: ", action); 
      } else { 
      console.log("TwitBot error:", err); 
      } 
     }); 
     } 
    }); 
    } 
}); 

확실히이 문제를 처리하는 더 나은 방법이 ... 어떤 도움을 많이 고맙습니다.

+1

이 아니다 PHP/C/자바를 수행하여 익명 함수에 userAName 변수를 카레했습니다! 변수를 전달할 필요가 없습니다. 스코프 조회 체인을 통해 항상 사용할 수 있습니다 ... 범위의 최상위 레벨에서 한 번만 선언하면 (지금까지와 마찬가지로) 해당 함수 내부에서 액세스 할 수 있습니다. ** 토끼 구멍을 통과 할 필요가 없습니다 !! ** –

+0

음 ... 그렇다면 내 변수가 정의되지 않은 이유는 무엇입니까? 그리고 바인드/카레닝의 이유는 @Raynos의 답변이 – Christopher

+0

이하인 것을 의미합니다. userBid가 올바르게 정의되어 있으며 쿼리 내에서 액세스 할 수 있어야합니다. 함수 외부에 정의되어 있으므로 함수 내부에서 볼 수 있습니다. 변수가 실제로 올바르게 정의되고 tag.user가 정의되지 않았는지 확인하십시오. 간단한 console.log (userBid)가이 질문을 해결해야합니다. – Jorre

답변

2
User.find({ 
    id: userAid 
}, function(err, userA) { 
    if (err) throw err; 
    else { 
     User.find({ 
      id: tag.user 
     }, (function(userAName, err, userB) { 
      if (err) throw err; 
      else { 
       var action = "@" + userAName + " just claimed some of @" + userB.twitter.screenName + " 's turf as their own."; 
       twitterClient.updateStatus(action, function(err, resp) { 
        if (!err) { 
         console.log("Tweeted: ", action); 
        } else { 
         console.log("TwitBot error:", err); 
        } 
       }); 
      } 
     }).bind(null, userA.twitter.screenName)); 
    } 
}); 

하나를 사용 고정 범위 (tag.user 클로저 통해 가능) 또는 함수 변수 .bind 바인딩을 사용한다.

예를 들어 우리는

(function(userAName, normal, arguments, here) { 

}).bind(null, userAName)); 
+0

답장을 보내 주셔서 감사합니다.이 절에 대해 혼란 스럽습니다.'(function (userAName, err, userB) {'이 콜백이 제 3 자 (몽구스)에 의해 해고되는 것을보고 걱정됩니다. 'userAName'을 사용하여, 나는 첫 번째 인자가'err'라고 인상을 받았다. ... 또는 여러분이 제안한 것을 수행하는 것이 안전 할까? – Christopher

+0

@Christopher는'.bind' 방법을 사용한다. 첫 번째 인수가 잠기고 나머지 인수가 첫 번째 인수 뒤에 놓입니다. – Raynos

+0

Brilliant! thanks – Christopher

관련 문제