Поддержание переменных через область видимости переменных в Javascript - PullRequest
1 голос
/ 01 сентября 2011

У меня проблемы с работой с переменной областью действия в приложении 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 Ответ

2 голосов
/ 01 сентября 2011
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 для привязки переменных к функции.

Например, мы ввели переменную userAName в анонимную функцию, выполнив

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

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