【发布时间】:2014-01-18 10:24:27
【问题描述】:
我是 Node.js 平台的新手,我正在努力学习。在玩过回调之后,一件事真的让我很困惑:
所以,我有这个功能:
function registerUser(body, res, UserModel){
var userJSON = {
email : body.email,
password : body.password,
accessToken : null
};
var user = null;
var userAlreadyExists = false;
UserModel.find({}).select('email').exec(function(err, results){
if(err){
console.log('Database error : ' + err);
// send the appropriate response
}else{
for(var index in results){
if(results[index].email == userJSON.email){
userAlreadyExists = true;
break;
}
}
if(userAlreadyExists){
// send the appropriate response
}else{
newAccessToken(UserModel, function(error, token){
if(error != null){
// handle the error
}else{
userJSON.accessToken = token;
user = new UserModel(userJSON);
user.save(function(err){
if(err){
// .. handle the error
}else{
// .. handle the registration
}
});}});}}});}
然后是接受回调的函数:
function newAccessToken(UserModel, callback){
UserModel.find({}).select('email accessToken').exec(function(err, results){
if(err){
callback(err, null);
}else{
// .... bunch of logic for generating the token
callback(null, token);
}
});
}
我希望回调不起作用(可能会引发错误),因为 user 和 userJSON 都没有在它的上下文中定义。(嗯,这并不完全正确,但因为它是异步执行的 - 在而 - ,我希望回调丢失它对那些变量的引用,这些变量是在 registerUser 函数中本地定义的)。相反,这个例子完美地工作,回调函数保持它的引用与registerUser 函数中定义的这两个变量。有人可以解释一下异步回调和引用是如何工作的,以及为什么这个例子有效吗?
【问题讨论】:
标签: javascript node.js callback mongoose