2013-04-16 21 views
3

我在节点中使用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(); 

我想嘘等于回调返回的布尔。

我试图声明一个变量初始化,然后将返回的布尔值,

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很陌生,并试图在提问时做得更好。这是一个我正在使用的类的应用程序。我用python编写了大部分的web.py文件,并且由于与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); 
} 

,并从数据库获取密码,用户名的功能:

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

我知道,这是验证一个不安全的方式。我想知道是否有更好的方法来做到这一点。我试图根据密码是否匹配返回一个布尔值。

+0

退房http://stackoverflow.com/a/16021543/893780,我回答了类似的问题。 – robertklep

+0

请参阅编辑,仍然返回未定义。 –

+0

关于你的编辑:'quecall'没有返回值,所以'returned'当然是'undefined'。您应该将回调传递给'caller',完全如@robertklep所示。 – apsillers

回答

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

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

+0

我没有问题做console.log()。我遇到的问题是将值返回给调用它的函数。这是从另一个模块调用的。 –

+0

我明白了,但我向您展示了如何处理异步函数,您无法从中返回值。所以你需要做的处理必须在回调中以某种方式进行*。您可以使用像[异步](https://github.com/caolan/async)或[node-promise](https://github.com/kriszyp/node-promise)这样的模块来处理这种工作流程。 – robertklep

0

我展示了如何在这个博客的事件发射返回一个承诺后https://glebbahmutov.com/blog/promisify-event-emitter/

+0

虽然这可能是正确的,但[回答指南](https://stackoverflow.com/help/how-to-answer)指示您“在链接附近添加上下文”和“始终引用重要的最重要部分链接“,你忽略了做 – xavdid

+0

链接死 - 域出售。 – JHH