我正在尝试编写一个可以在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));
});
});
}
答案 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
}
});
承诺会很好但不是必需的。