2012-11-01 96 views
1

爲什麼這段代碼返回$ products是空的?如果我在函數內測試$ product,它會顯示數據......但一旦完成,我似乎無法獲取數據。匿名函數中JS變量的範圍是什麼

var $products = new Array(); 
connection.query($sql, function(err, rows, fields) { 
    if (err) throw err; 
    for(i=0; i< rows.length; i++) 
    { 
     $products[rows[i].source_identifier] = "xyz"; 
    } 

}); 
connection.end(); 

console.log($products); // Shows empty. 
+4

歡迎來到** async **的美妙世界!你不能那樣做。 – SLaks

回答

2

它不回報爲空;沒有return聲明。問題是操作是異步。當您的console.log()調用運行時,查詢尚未完成。

將您的console.log()致電裏面的表示回撥函數,在for之後循環。 (同時聲明「i」爲var !!!)

使用涉及回調的API的全部重點是應對操作是異步的事實。如果它們是同步的,那麼設計這樣的接口會很奇怪。

+0

我的第一個直覺是這是一個異步的問題....我試圖把回撥給回撥,但我得到奇怪的數據..你能舉一個快速的例子嗎?謝謝。 – smorhaim

+0

@smorhaim添加一個'return'什麼都不做,因爲它只是將它返回到在調用connection.query時建立的異步上下文中稱爲回調的任何東西。簡而言之,您不能在回調之外訪問填充的$ products。 – JohnnyHK

+0

@smorhaim,對'connection.query'的調用立即返回(幾乎)。結果到達時,您只需保留一個回調函數即可運行。 – acelent