2013-10-28 51 views
0

爲什麼resultofgetCauses未定義?我不確定該函數是不是返回currentCauses或者它沒有被分配到resultofgetCauses。 。 。或者如果這與異步性有關。分配後變量undefined

function getCauses(){ 

    var currentCauses; 
    client = pg.connect(connectionString, function(err, client, done){ 

    if(err) console.log(err); 

    client.query('SELECT * FROM causes', function(err, result){ 
     //console.log(result.rows); 
     console.log('poo'); 
     currentCauses=result.rows; 
     //console.log(currentCauses); 
    }); 

    }); 

    return currentCauses; 
}; 

var resultofgetCauses = getCauses(); 
+3

異步代碼?看到這裏http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – elclanrs

+0

我不認爲這是異步,這是問題,雖然 –

+1

它是,'currentCauses ''未定義'resultofgetCauses'在**'pg.connect'有時間完成之前被賦值**。這個問題有一個深入解決您的問題。 – elclanrs

回答

2

是因爲它的運行asynchronously,通過result.rows分配給currentCauses變量的時間,行'return currentCauses'已經這樣執行的價值是不確定的。

您可能需要做如下

var resulttofgetCauses; 
function getCauses(){ 
    var currentCauses; 
    client = pg.connect(connectionString, function(err, client, done){ 
     if(err) console.log(err); 
     client.query('SELECT * FROM causes', function(err, result){ 
      //console.log(result.rows); 
      console.log('poo'); 
      currentCauses=result.rows; 
      //console.log(currentCauses); 
      resulttofgetCauses = currentCauses; 
     }); 
    }); 
}; 
getCauses(); 

更具體的答覆,執行'SELECT * FROM causes' SQL不給你結果執行時間之後。從數據庫中檢索數據至少需要0.00s秒。因此,在'執行sql'和'接收請求的數據'之間的很短時間內,JavaScript已經執行了return currentCauses;,而正確的數據仍在進行檢索。因爲它是異步的,不會等待。在互聯網上有很好的示例代碼,你可能想看看。

加上這是一個很好的做法,定義函數如下

getCauses = function() { ... } 
0

因爲currentCauses在異步初始化調用函數(如PARAM傳遞給pg.connect功能)後,你已經從getCauses函數返回。當您返回currentCauses的值是未定義的。