2013-09-25 50 views
1

我遇到麻煩使用類方法,基本上它是一個函數範圍問題(我猜)。Javascript範圍和閉包,變量保持其值

的JS代碼:

MysqlClass.prototype.registrar = function(usuario,password,correo,socket){ 
    var resultado; 
    this.connection.query("SELECT usuario FROM usuarios WHERE usuario=?;",[usuario],function(err,rows,fields){ 
     if(err){ 
      resultado = true; 
     } 
     if(rows.length==1){ 
      resultado = true; 
     }else{ 
      resultado = false; 
     } 
    }); 
    console.log(resultado); 
} 

console.log(resultado)顯示undefined當我想告訴truefalse

我使用NodeJSnode-mysql

+2

你必須看到回調中的結果。 –

+1

因爲回調是異步執行的。把這個日誌放在回調裏面,它會起作用 –

+1

我也很確定你想改變你的邏輯。如果'rows.length!= 1',即使設置了'err',resultado也會被設置爲'false'。只是覺得這不是你想要的。 –

回答

5

query()是一個異步操作。這意味着,如果您想在查詢數據庫之後執行某些操作,則必須將相關代碼放在的回調中。你的代碼是這樣:

MysqlClass.prototype.registrar = function(usuario,password,correo,socket){ 
    var resultado; 
    this.connection.query("SELECT usuario FROM usuarios WHERE usuario=?;",[usuario],function(err,rows,fields){ 
     if(err){ 
      resultado = true; 
     } 
     if(rows.length==1){ 
      resultado = true; 
     }else{ 
      resultado = false; 
     } 
     console.log(resultado); 
    }); 
} 

您可能要重寫registrar()所以它會調用回調函數查詢數據庫後:

MysqlClass.prototype.registrar = function(usuario, password, correo, socket, cb) { 
    var resultado; 
    this.connection.query("SELECT usuario FROM usuarios WHERE usuario=?;",[usuario],function(err,rows,fields){ 
     if(err){ 
      resultado = true; 
     } 
     if(rows.length==1){ 
      resultado = true; 
     }else{ 
      resultado = false; 
     } 
     cb && cb(resultado); 
    }); 
} 

,並用它喜歡:

var MysqlClassInstance = new MysqlClass(); 
// ... 
MysqlClassInstance.registrar(usuario, password, correo, socket, function (resultado) { 
    console.log(resultado); 
});