如何 return 来自 Q Node promise 的变量?
How to return a variable from a Q Node promise?
我有一个使用 Angular、Express、Mongo 和 Node 的学习游戏。我现在正在学习如何使用 promises,所以我可以等到某件事完成后再开始其他事情。
现在,我正在尝试等到数据库显示尝试登录的用户是否已有帐户。我已经成功了,所以如果用户不存在,.then()
将调用 onReject
函数来创建用户。
user
有主账号可以玩session。在每个会话中,他将收到一个新的 player
。如果 user
存在并尝试登录并且他的 player
被记录,他将收到 player
返回。如果player
不存在,服务器会为他创建一个
但是,我遇到了变量 logged
的问题,它表示用户是否已登录 player
。在函数 findUser
的第二行,我正在创建一个名为 logged
的变量,我正在尝试 return 它,因此我可以在 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
}
});
});
函数查找用户
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;
};
我如何return 承诺中的 logged
变量在我需要的任何地方使用?
如果您 return 来自 .then()
处理程序的值,那么该值将成为承诺的已实现值。
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
});
如果这段代码在一个函数中,那么你可以return来自UserModel.find()
的承诺:
function someFunc() {
return UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject);
}
然后,将 .then()
处理程序添加到 returned promise。
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()
看起来不是异步的,所以我真的不明白你为什么要对它使用 promise。看来您可以直接从函数中 return true
或 false
。
我有一个使用 Angular、Express、Mongo 和 Node 的学习游戏。我现在正在学习如何使用 promises,所以我可以等到某件事完成后再开始其他事情。
现在,我正在尝试等到数据库显示尝试登录的用户是否已有帐户。我已经成功了,所以如果用户不存在,.then()
将调用 onReject
函数来创建用户。
user
有主账号可以玩session。在每个会话中,他将收到一个新的 player
。如果 user
存在并尝试登录并且他的 player
被记录,他将收到 player
返回。如果player
不存在,服务器会为他创建一个
但是,我遇到了变量 logged
的问题,它表示用户是否已登录 player
。在函数 findUser
的第二行,我正在创建一个名为 logged
的变量,我正在尝试 return 它,因此我可以在 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
}
});
});
函数查找用户
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;
};
我如何return 承诺中的 logged
变量在我需要的任何地方使用?
如果您 return 来自 .then()
处理程序的值,那么该值将成为承诺的已实现值。
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
});
如果这段代码在一个函数中,那么你可以return来自UserModel.find()
的承诺:
function someFunc() {
return UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject);
}
然后,将 .then()
处理程序添加到 returned promise。
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()
看起来不是异步的,所以我真的不明白你为什么要对它使用 promise。看来您可以直接从函数中 return true
或 false
。