socket.io получает значение, которое обещание возвращается вместо обещания - PullRequest
0 голосов
/ 19 ноября 2018

в 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 Ответ

0 голосов
/ 19 ноября 2018

Итак, checkUserExist() возвращает обещание, а не значение.Вот как ты это закодировал!

И, поскольку значение получается асинхронно, вы все равно не можете вернуть значение напрямую.См. канонический ответ по этому вопросу для более подробного объяснения по этой теме.

Чтобы заставить ваш код работать должным образом, вы должны фактически использовать обещание, которое возвращает ваша функция:

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);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...