socket.io获取promise返回而不是promise {待处理}的值

时间:2018-11-19 04:32:33

标签: asynchronous socket.io promise

在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这样的库?

一吨:)

1 个答案:

答案 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);
    });
});