代码之家  ›  专栏  ›  技术社区  ›  Nik Hendricks

socket.io获取promise返回的值,而不是promise pending

  •  0
  • Nik Hendricks  · 技术社区  · 6 年前

    在socket.io中,我试图检查一个用户是否足够容易地存在到我可以调用的位置

    if(checkUserExist(uid) == 'true'){
        success();
    }else{
        failure();
    };
    

    所以我发现我需要使用承诺,因为我用来从数据库获取信息的函数是异步的,所以我这样做。

    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 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

    所以, 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);
        });
    });