我有一个使用Angular,Express,Mongo和Node的学习游戏。我现在正在学习如何使用promises,所以我可以等到一些事情完成后再开始其他事情。
现在,我正在尝试等到数据库说出用户是否已尝试登录已有帐户。我已经成功了,所以如果用户不存在,.then()
将调用将创建用户的onReject
函数。
user
有一个主帐户,可以播放会话。在每个会话中,他将收到一个新的player
。如果user
存在并尝试登录并且记录了他的player
,他将收到player
。如果player
不存在,服务器将为他创建一个。
但是,我遇到了变量logged
的问题,该问题表明用户是否已记录player
。在函数findUser
的第二行,我正在创建一个名为logged
的变量,我正在尝试将其返回,因此我可以使用onResolve
函数。
UserModel.find(
{ username: username, password: password},
findUser ).then(
onResolve,
onReject );
On Promise resolve
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;
};
如何从承诺中返回logged
变量以便在我需要的任何地方使用?
答案 0 :(得分:3)
如果从.then()
处理程序返回值,则该值将成为promise的已实现值。
var onResolve = function (logged) {
if (logged) {
//RETURN USER'S PLAYER
} else {
//CREATE USER'S PLAYER
}
// ** add this **
return logged;
}
然后,您可以在后续的.then()
处理程序中使用它:
UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject)
.then(function(result) {
// can access result here
});
如果此代码在函数内,则可以从UserModel.find()
返回承诺:
function someFunc() {
return UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject);
}
然后,在返回的promise中添加.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
。