【问题标题】:Return a value from an event emitter callback从事件发射器回调中返回一个值
【发布时间】:2017-08-18 20:35:42
【问题描述】:

我在 node.js 中使用 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。

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

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

以及从数据库中获取用户名密码的函数:

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

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

【问题讨论】:

  • 查看stackoverflow.com/a/16021543/893780 我回答了类似问题。
  • 查看编辑,仍然返回未定义。
  • 关于您的编辑:quecall 不返回值,所以returned 当然是undefined。您应该按照@robertklep 的建议将回调传递给caller
  • 查看编辑:从我的应用程序中添加了真实代码而不是伪代码。
  • 感谢您的帮助,结束了使用我的身份验证脚本中的 db 连接烘焙实用程序文件以使其正常工作。

标签: javascript node-postgres


【解决方案1】:

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

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

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

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

【讨论】:

  • 我在执行 console.log() 时没有问题。我遇到的问题是将值返回给调用它的函数。这是从另一个模块调用的。
  • 我明白,但我正在向您展示如何处理异步函数,您无法从中返回值。所以你需要做的处理必须在回调中以某种方式进行。您可以使用 asyncnode-promise 之类的模块来更轻松地处理此类工作流。
【解决方案2】:

我在这篇博文 https://glebbahmutov.com/blog/promisify-event-emitter/ 中展示了如何从事件发射器返回承诺

【讨论】:

  • 虽然这可能是正确的,但 answering guidelines 会指示您“在链接周围添加上下文”和“始终引用重要链接中最相关的部分”,而您忽略了这样做
  • 链接失效 - 域名出售。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2016-04-11
  • 2019-04-19
  • 2020-12-18
  • 1970-01-01
相关资源
最近更新 更多