如何从Q节点promise返回变量
How to return a variable from a Q Node promise?
我有一个使用Angular、Express、Mongo和Node的学习游戏。我现在正在学习如何使用承诺,这样我就可以等到某件事完成后再开始其他事情。
现在,我正试图等到数据库显示尝试登录的用户是否已经有了帐户。我已经成功地做到了,所以如果用户不存在,.then()
将调用创建用户的onReject
函数。
user
有一个主帐户,可以播放会话。在每次会话中,他将收到一个新的player
。如果user
存在并尝试登录,并且他的player
已登录,则他将接收回该player
。如果player
不存在,服务器将为他创建一个。
但是,我对变量logged
有一个问题,它表示用户是否有一个已记录的player
。在函数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
}
});
});
函数查找用户
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;
}
然后,您可以在随后的.then()
处理程序中使用它:
UserModel.find({ username: username, password: password}, findUser)
.then( onResolve, onReject)
.then(function(result) {
// can access result here
});
如果此代码在函数中,则可以从UserModel.find()
:返回promise
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()
看起来并不是异步的,所以我真的不明白为什么要使用promise。看起来您可以直接从函数返回true
或false
。
相关文章:
- 如何从节点中的api promise返回对象
- 如何将从$promise返回的数据分配给全局变量
- Bluebird:运行promise返回函数序列
- 如何使用promise返回从递归AJAX调用构建的集合
- 如何正确编码promise返回函数
- 如何从Q节点promise返回变量
- 从Promise返回值
- Angularjs检查是否有2个promise返回
- Sequelize:如何访问[object Promise]或从Promise返回值
- 如何用chai断言从promise返回的json
- 将从节点promise返回的对象循环到下一个.then
- AngularJS异步请求方法服务使用promise返回数据
- 单元测试:在模拟promise返回来测试我的emit时遇到困难
- 从Promise返回值到Promise. all
- 为什么'new Promise(…)'返回& # 39;未定义# 39;
- AngularJS ajax http promise返回额外的数据
- AngularJS服务内部的promise返回值似乎会改变
- 定义一个NavigationInstruction,等待promise返回
- 如何使用promise返回数组的最终结果
- 在Promise返回函数中找到第一个成功