我有一个正在调用的函数,我需要在该函数内进行一些数据库查询。在节点中执行此操作的最佳方法是什么?目前,我只是发出请求,并将返回值分配给变量,但这导致未设置变量。例:

// 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的函数中设置变量的最佳方法。理想情况下将如何进行?

最佳答案

承诺是一种很好的方法。您将像这样使用它们:

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);
});

09-25 18:42
查看更多