在Javascript中通过变量范围维护变量

时间:2011-09-01 18:33:34

标签: javascript node.js callback scope mongoose

我无法使用我正在制作的Node.js应用程序来处理变量作用域,通常我理解变量作用域在函数中/周围是如何工作的(在这个例子中,是匿名回调函数)。

我正在努力的是通过匿名回调链/洞来维​​持可变品的最佳方式。通常情况下,我可以将变量传递给函数,但因为我使用的是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 个答案:

答案 0 :(得分: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将变量绑定到函数。

例如,我们通过执行

userAName变量放入匿名函数中
(function(userAName, normal, arguments, here) {

}).bind(null, userAName));