我在节点中使用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。
答案 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/
中展示如何从事件发射器返回承诺