2013-12-21 182 views
1

我正在用Node.js構建一個小型報表工具,我正面臨着一些Javascript的範圍問題。我正在調用一個函數,它應該從數據庫查詢中返回一個包含城市的數組。這裏的功能。Js函數返回undefined

function queryBuilderZone() { 
    var includedCities = new Array(); 
    q = heredoc(function(){/* 
     SELECT majlis.MajlisId 
     FROM majlis 
     WHERE majlis.ZoneId = -ZONE- 
    */}); 
    q = q.replace(/-ZONE-/g, inZone); 

    connection.query(q, function(err, rows, fields) { 
     if (err) throw err; 
     var rowsLentgh = rows.length; 
     for (var i = 0; i < rowsLentgh; i++) { 
       includedCities.unshift(rows[i].MajlisId); 
     }; 
     console.log(includedCities); // <-- output correct: ['...', '....'] 
    }); 
    connection.end(); 
    console.log(includedCities); // <-- output wrong: [] 
    return includedCities; 

}

這是主程序

includedCities = queryBuilderZone(); 
console.log(includedCities); // <-- output wrong: [] 

我的電話在哪裏的問題,這是爲什麼不函數返回數組includedCities中的元素?
而在connection.query的範圍內,它顯示正確和預期的值。

順便說一下,我使用mysql模塊來構建查詢並替換查詢中的佔位符。

+0

標準異步情況。在回調完成之前,您的「錯誤」控制檯日誌發生了嗎?而「includeCities」是你的函數的一個局部變量。 – npup

+0

在我看來,這是一個範圍界定問題。我不是node.js人員,但includeCities在queryBuilderZone函數中定義,該函數不在全局範圍內。將其移到全局範圍的函數上方。 –

+0

@rontornambe這是一個非常典型的node.js初學者問題,他們沒有找到時間閱讀一個小教程。 – hgoebl

回答

3

這裏發生了什麼是回報和回調之間的區別。由於connection.query()函數不得不伸手去獲取它的信息,所以queryBuilderZone()函數在它啓動後會繼續運行,然後得出結論,includedCities是空數組,因爲它是在那個時候。

你想要做什麼是傳遞一個回調queryBuilderZone,像這樣

function queryBuilderZone(callback) { 
    var includedCities = new Array(); 
    q = heredoc(function() { 
     /* 
     SELECT majlis.MajlisId 
     FROM majlis 
     WHERE majlis.ZoneId = -ZONE- 
    */ 
    }); 
    q = q.replace(/-ZONE-/g, inZone); 

    connection.query(q, function (err, rows, fields) { 
     if (err) throw err; 
     var rowsLentgh = rows.length; 
     for (var i = 0; i < rowsLentgh; i++) { 
      includedCities.unshift(rows[i].MajlisId); 
     }; 
     console.log(includedCities); // <-- output correct: ['...', '....'] 
     callback(includedCities); 
    }); 
    connection.end(); 
    console.log(includedCities); // <-- output wrong: [] 
    // return includedCities; Not needed 
} 

然後,當你想使用它,你會做這樣的。

queryBuilderZone(function(includedCities) { 
    // Do what you'd like here 
    console.log(includedCities); // <-- output correct: ['...', '....'] 
}); 

無論是在回調函數connection.query後,將被執行的運行過程中,並吐出陣列。

+1

謝謝!我不知道回調。因此,我只是試圖同時學習和解決問題。儘管我可以用其他語言解決它。我有任何好的回調教程,然後不要猶豫分享:) – imalik8088