2013-04-15 119 views
0

我确信这里的问题是根本,我不是必要的,异步的方式思考却为Node.js的为什么这个函数的返回值被忽略?

我有一个函数userExists()一个模块db它检查时通过电子邮件用户是否在数据库中,并返回truefalse英寸

相关部分:

userExists : function(email) { 
    var client = new pg.Client(app.conString); 
    var query; 
    var result = false; 

    client.connect(); 

    query = client.query(
     "SELECT * FROM users WHERE email = $1", 
     [email] 
    ); 

    query.on('row', function(row) { 
     result = true; 
    }); 

    query.on('end', function() { 
     client.end(); 
     return result; 
    }); 

我打电话这样说:

if (!db.userExists(req.session.email)) { 
     newUser(); 
    } else { 
     updateUser(); 
    } 
} 

它始终是newUser()被称为,无论userExists()回报。我该如何解决这个问题?

回答

1

你有时间错了。你功能后运行,所以你需要传递一个回调函数和“等待”的结果的查询完成。

userExists = function(email, cb) { 
    var client = new pg.Client(app.conString); 
    var query; 
    var result = false; 

    client.connect(); 

    query = client.query(
     "SELECT * FROM users WHERE email = $1", 
     [email] 
    ); 

    query.on('row', function(row) { 
     result = true; 
    }); 

    query.on('end', function() { 
     client.end(); 
     cb(result); 
    }); 
} 


// Time 1: ask is the user exists 
db.userExists(req.session.email, function(exists) { 
    // Time 3: Yeah result came back 
    if (exists) { 
     updateUser() 
    } 
    else { 
     newUser(); 
    } 
}); 
// Time 2: I've asked, let's wait for the result 
// The following code will likely be executed before you get the result back 
+0

谢谢!我基本上在那里,但由于某种原因无法做出最后的飞跃。我把它归咎于我的感冒。 – tsvallender

+1

没什么大不了的。调整节点异步流程需要一段时间。 – TheHippo