异步返回问题

时间:2017-05-30 22:33:11

标签: javascript asynchronous

我正在尝试编写一个可以在if语句中使用的函数。我使用了回调函数来避免由于Javascript的异步性而导致响应未定义。我这样做错了吗?有更好的方法吗?

if(emailExists(Email, someCallback)){
  //email does exist, do stuff
}

基本上我只想要一个函数告诉我,我的数据库中是否存在一封电子邮件以返回true,但即使我采取了所有的预防措施,我仍然会在运行此代码时未定义。

function someCallback(e){
  console.log(e);
  return e;
}

function emailExists(input, callback) {
  pg.connect(conString, function(err, client, done){
    //Connect to database

    client.query('select email from users', function(err, result){
      //select all emails from database

      var tempArray = [];
      for(var x = 0; x < result.rows.length; x++){
        tempArray.push(result.rows[x].email)
      } //create array of emails

      callback(tempArray.includes(input));
    });
  });
}

2 个答案:

答案 0 :(得分:3)

我建议使用Promise,这样可以更方便地使用异步。我之前没有使用过pg-js,也不知道它是否支持promises - 如果是这样,你可以简单地使用它返回的promise;如果没有,下面的代码将适合您:

function emailExists(input) {
    return new Promise((resolve, reject) => {
        pg.connect(conString, function (err, client, done) {
            client.query('select email from users', function (err, result) {
                var tempArray = [];
                for (var x = 0; x < result.rows.length; x ++) {
                    tempArray.push(result.rows[x].email)
                }
                resolve(tempArray.includes(email));
            });
        });
    });
}

然后您可以像这样使用它:

emailExists("foo@bar.baz")
    .then(exists => {
        if (exists) {
            // email exists
        } else {
            // not
        }
    });

答案 1 :(得分:0)

您只需将if语句放入回调中即可。

emailExists(Email, function(hasMail){
    if(hasMail){
        //email does exist, do stuff
     }
 });

承诺会很好但不是必需的。