2013-04-15 160 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