Javascript 如何从Q节点返回变量?
我有一个使用Angular、Express、Mongo和Node的学习游戏。我现在正在学习如何使用承诺,所以我可以等到事情完成后再开始其他事情 现在,我正在尝试等待,直到数据库显示尝试登录的用户是否已经拥有帐户。我已经成功了,因此如果用户不存在,Javascript 如何从Q节点返回变量?,javascript,angularjs,node.js,mongoose,q,Javascript,Angularjs,Node.js,Mongoose,Q,我有一个使用Angular、Express、Mongo和Node的学习游戏。我现在正在学习如何使用承诺,所以我可以等到事情完成后再开始其他事情 现在,我正在尝试等待,直到数据库显示尝试登录的用户是否已经拥有帐户。我已经成功了,因此如果用户不存在,.then()将调用创建用户的onReject函数 用户拥有主帐户,可以播放会话。在每个会话中,他将收到一个新的播放器。如果用户存在并尝试登录,并且他的播放器被记录,他将收到该播放器的回复。如果播放器不存在,服务器将为他创建一个 但是,变量logged有
.then()
将调用创建用户的onReject
函数
用户
拥有主帐户,可以播放会话。在每个会话中,他将收到一个新的播放器
。如果用户
存在并尝试登录,并且他的播放器
被记录,他将收到该播放器
的回复。如果播放器
不存在,服务器将为他创建一个
但是,变量logged
有一个问题,即如果用户有一个loggedplayer
。在函数findUser
的第二行,我正在创建一个名为logged
的变量,并尝试返回它,以便在onResolve
函数中使用
UserModel.find(
{ username: username, password: password},
findUser ).then(
onResolve,
onReject );
承诺解决
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
}
拒绝承诺
var onReject = function () {
userModel.save( function (err) {
if (!err) {
//CREATE USER
//CREATE USER'S PLAYER
}
});
});
函数findUser
var findUser = function (err, data) {
var logged = false;
var userSearched = Q.defer();
if (data.length) { //IF USER IS IN DATABASE
logged = true;
userSearched.resolve(logged);
} else {
userSearched.reject(logged);
}
return userSearched.promise;
};
如何从promise返回
logged
变量,以便在需要的任何地方使用?如果从.then()
处理程序返回值,则该值将成为promise的已实现值
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
// ** add this **
return logged;
}
然后可以在后续的处理程序中使用它。然后()
处理程序:
UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject)
.then(function(result) {
// can access result here
});
如果此代码在函数中,则可以从
UserModel.find()
返回承诺:
然后,将.then()
处理程序添加到返回的承诺中
someFunc().then(function(result) {
// access result here
});
或者,在
findUser()函数中:
var findUser = function (err, data) {
var userSearched = Q.defer();
if (data.length) { //IF USER IS IN DATABASE
userSearched.resolve(true);
} else {
userSearched.reject(false);
}
return userSearched.promise;
};
findUser.then(function(val) {
// access resolved value here
}, function(err) {
// access rejected reason here
});
不过,findUser()
看起来不是异步的,所以我真的不明白您为什么要对它使用承诺。似乎您可以直接从函数返回true
或false
。如果您从.then()
处理程序返回值,则该值将成为承诺的已实现值
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
// ** add this **
return logged;
}
然后可以在后续的处理程序中使用它。然后()
处理程序:
UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject)
.then(function(result) {
// can access result here
});
如果此代码在函数中,则可以从UserModel.find()
返回承诺:
然后,将.then()
处理程序添加到返回的承诺中
someFunc().then(function(result) {
// access result here
});
或者,在findUser()函数中:
var findUser = function (err, data) {
var userSearched = Q.defer();
if (data.length) { //IF USER IS IN DATABASE
userSearched.resolve(true);
} else {
userSearched.reject(false);
}
return userSearched.promise;
};
findUser.then(function(val) {
// access resolved value here
}, function(err) {
// access rejected reason here
});
不过,findUser()
看起来不是异步的,所以我真的不明白您为什么要对它使用承诺。看起来您可以直接从函数返回true
或false
。您不能将记录的
返回到承诺之外。相反,返回承诺,并在需要的任何地方使用它记录的。我将返回userSearched.promise。如何从那里访问记录的值?请参阅jfriend00的回答您不能将记录的返回到承诺之外。相反,返回承诺,并在需要的任何地方使用它记录的。我将返回userSearched.promise。如何从那里访问记录的值?请参阅jfriend00的回答谢谢您快速完整的回答。我正在尝试谢谢你快速完整的回答。我正在尝试