在socket.io中,我正在尝试检查用户是否足够容易地存在我可以致电的地方
if(checkUserExist(uid) == 'true'){
success();
}else{
failure();
};
所以我发现我需要使用Promise,因为我用来从数据库获取信息的功能是异步的,所以我这样做了
function checkUserExist(uid){
return new Promise(resolve => {
webUser.findOne({ _id: uid }, function(err, uid) {
if(uid){
console.log("USER EXISTS")
resolve('true')
}if(!uid){
console.log("USER NO REAL")
resolve('false')
}
})
});
当我尝试使用这种功能时
socket.on('getAgents',function(uid){
console.log(checkUserExist(uid))
if(checkUserExist(uid) == 'true'){
console.log('user does exist getting agents')
agentList.find({}, function(err, docs) {
docs.forEach(function(d) {
socket.emit('newAgent', d.agentName)
});
});
}else if(checkUserExist(uid) == 'false'){
console.log('invalid uid ' + uid)
socket.emit('serverError', 'Invalid UID '+ uid)
}
})
返回的值为Promise { <pending> }
我不确定该怎么做,我认为这是一个简单的任务,但是显然我还不知道该怎么做。有没有人可以帮助我。
对我来说,承诺是一个相当新的概念,我仍然不完全了解它们的工作方式,也许应该使用像promisify这样的库?
一吨:)
答案 0 :(得分:1)
因此,checkUserExist()
返回一个诺言,而不是一个值。这就是您的编码方式!
并且,由于该值是异步获取的,因此无论如何您都无法直接返回该值。有关该主题的更多说明,请参见canonical answer on that issue。
要使代码正常工作,您必须实际使用函数返回的承诺:
socket.on('getAgents',function(uid){
console.log(checkUserExist(uid))
checkUserExist(uid).then(result => {
if (result) {
agentList.find({}, function(err, docs) {
if (err) {
// decide what to do if there's a DB error here
return;
}
docs.forEach(function(d) {
socket.emit('newAgent', d.agentName)
});
});
} else {
socket.emit('serverError', 'Invalid UID ' + uid)
}
}).catch(err => {
socket.emit('serverError', 'Error processing UID ' + uid);
});
});