我有一个我正在调用的函数,我需要在该函数内部进行一些数据库查询。在节点中执行此操作的最佳方法是什么?目前我只是发出请求并将返回值赋给变量,但这会导致变量未被设置。例如:
// bunch of code
var is_member = false;
mysql.query('SELECT EXISTS ( SELECT * FROM `qazusers` WHERE `qazemail` = ? OR `otheremail` = ? LIMIT 1)', [emailaddress, emailaddress], function (err, result) {
if (err) {
logger.info('Error checking. ', err);
}
logger.info('checkmembership: ', result);
if (result[0] === 1) {
is_member = true;
}
// bunch more code finishing out the function this is inside
包含函数运行完毕后,is_member
始终为false。我假设这是由于节点的异步性质,但是,处理这个问题的最佳方法是什么?我已经在Promises上读过一些内容(比如Q库),但我仍然不确定处理基于nodejs的函数内部变量的最佳方法。理想情况下,如何做到这一点?
答案 0 :(得分:2)
承诺是一种很好的方法。你会像这样使用它们:
var promise = Q.ninvoke(mysql, "query", 'SELECT EXISTS ( SELECT * FROM `qazusers` WHERE `qazemail` = ? OR `otheremail` = ? LIMIT 1)', [emailaddress, emailaddress])
var moreresults = promise.then(function(result) {
logger.info('checkmembership: ', result);
return result[0] === 1;
}).then(function(is_member) {
// bunch more code finishing out
return more;
});
moreresults.catch(function(err) {
logger.info('Error checking. ', err);
});