2012-06-12 166 views
1
function foreignCoordinatesArray(){ 

    var coordinates = []; 
    $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success); 

    function success(ary) { 
    for(var a in ary){ 
     var obj = ary[a]; 
     coordinates.push(new google.maps.LatLng(obj.latitude, obj.longitude)); 
    } 

    } 
    console.log(coordinates); 
} 

在結束座標仍然是[]而不是[{...},{...},...]。 我想這肯定是關閉的問題從回調函數獲取變量

我怎麼能在座標數組中有我想要的值?

+2

嘗試console.log裏面成功功能 – Dhiraj

回答

4

這不是閉包問題,而是JavaScript異步AJAX調用。當AJAX呼叫響應到達(並且您的成功函數被調用,傳播coordinates數組)時,您在登錄該數組之後就是這種方式 - 當時它是空的。

我想你想以某種方式從foreignCoordinatesArray()函數返回coordinates。正如你所看到的,你不能使用return

function foreignCoordinatesArray(){ 
    var coordinates = []; 
    $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success); 

    function success(ary) { 
    //... 
    } 
    return coordinates; 
} 

相反,你應該傳遞一個回調函數將接收coordinates

function foreignCoordinatesArray(coordinatesCallback){ 
    var coordinates = []; 
    $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success); 

    function success(ary) { 
    //... 
    coordinatesCallback(coordinates); 
    } 
} 

BTW,你應該使用它作爲URL的一部分之前逃脫$('#foreign_travel').val()

+0

謝謝!那是我一直在尋找的。 –

1

執行console.log()後發生回調。如果您將console.log()移動到回調函數中,您應該獲得預期的輸出。

function foreignCoordinatesArray(){ 

    var coordinates = []; 
    $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success); 

    function success(ary) { 
    for(var a in ary){ 
     var obj = ary[a]; 
     coordinates.push(new google.maps.LatLng(obj.latitude, obj.longitude)); 
    } 
    console.log(coordinates); 
    } 

} 
2

問題不在於「閉包」本身,而在於異步編程。在獲取JSON之前,不會調用成功函數,在您的foreignCoordinatesArray()函數返回後,這幾乎總是很長。通常,當您使用$.getJSON()這樣的異步函數時,回調之外的任何代碼都不應該假定回調已經運行,因爲這通常不是一個安全的假設。

這種情況下的解決方案是將console.log(coordinates)移動到成功函數中。