从事件发射器回调中返回一个值

时间:2013-04-16 15:24:46

标签: javascript node-postgres

我在节点中使用postgresql模块'pg'。我想从数据库返回一行时进行一些处理,但我不知道如何将值返回给调用函数。

var caller = function(){
    var query = client.query(qString);
    query.on('row', function(row){
        if (row.foo == bar) {
            return true;
        } else {
            return false;
        }
    }
};

我打电话的时候:

var boo = caller();

我希望boo等于回调的返回bool。

我试图声明一个未初始化的变量,然后分配返回的bool的值,

var caller = function(){
    var fido;
    var query = client.query(qString);
    query.on('row', function(row){
        if (row.foo == bar) {
            fido = true;
        } else {
            fido =  false;
        }
    }
    return fido;
};

但是函数不会等到'pg'返回一行。这会导致返回的变量未定义返回。我想我需要同步调用它的一部分,所以变量的赋值发生在函数返回之前,但我不知道如何为正常函数执行此操作。

编辑:

足够的伪代码。我是Node的新手,并试图更好地提出问题。这是我所在类的一个应用程序。我用web.py在python中写了大部分内容,因为与angular.js框架冲突并在node.js中重写,我没有太多经验用。我遇到问题的部分是验证用户。这是被调用的模块。

var postAuth = function(params, callback){
    var user = params['username'];
    var pass = params['password'];
    var result;
    util['dispatch']['auth'](user, function(blah){
        if (pass == blah) {
            result = true;
        } else {
            result = false;
        }
    });
    console.log(result);
    return callback(200, "OK", {}, result);
}

以及从DB获取用户名密码的函数:

var auth = function(user, callback) {
    client.connect();
    var qString = "SELECT password FROM users WHERE username='" + user + "'";
    var query = client.query(qString);
    query.on('row', function(row) {
            callback(row.password);
    }); 
};  

我知道这是一种不安全的身份验证方式。我想知道是否有更好的方法来做到这一点。我试图根据密码是否匹配来返回bool。

2 个答案:

答案 0 :(得分:2)

您不能使异步函数同步(这也意味着从异步函数返回值 - 通常 - 没有效果)。

处理异步函数结果的常用解决方案是传递一个回调函数,该函数在结果可用时被调用:

var caller = function(callback) {
  var query = client.query(qString);
  query.on('row', function(row){
    callback(row.foo == bar);
  }
};

// and to call it:
caller(function(result) {
  console.log('I received a result:', result);
});

回调函数将一次调用一行。

答案 1 :(得分:0)

我将在此博文https://glebbahmutov.com/blog/promisify-event-emitter/

中展示如何从事件发射器返回承诺