2012-06-12 5 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 배열 전파) 배열에 로그인 한 다음에는 비어 있습니다.

어쨌든 coordinatesforeignCoordinatesArray() 기능에서 반환하고 싶습니다. 당신은 당신이 return을 사용할 수 없습니다 볼 수 있듯이 :

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

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

가 BTW 당신이 URL의 일부로 사용하기 전에 $('#foreign_travel').val()을 탈출해야합니다
function foreignCoordinatesArray(){ 
    var coordinates = []; 
    $.getJSON('/critics.json?travel_id=' + $('#foreign_travel').val(), success); 

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

대신 당신은 coordinates를 받게됩니다 콜백 함수를 전달해야합니다.

+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)을 성공 기능으로 이동하는 것입니다.

관련 문제