我无法使用我正在制作的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);
}
});
}
});
}
});
当然有一种更好的处理方式...... 非常感谢你的帮助。
答案 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));