2013-07-19 2 views
0

'city'변수의 값을 반환하려고했지만 이상한 결과를 얻었습니다. 내 코드에 문제가 있음을 알고 있습니다. 내가 무엇인지 알아낼 수 있기를 바랍니다. .Jquery 함수에서 값 가져 오기

function getCity(lat,lng) 
{ 
var url="http://maps.googleapis.com/maps/api/geocode/json?latlng="; 
var sensor="&sensor=false"; 

var city; 
$.getJSON(url+lat+","+lng+sensor,function(json) 
    { 
     var address=json.results[0].address_components; 
     var addr; 
     for(var i in address) 
      { 
       addr=address[i]; 
       if(addr.types[0] == "locality" && addr.types[1] == "political") 
       { 
        city=addr.long_name; 

       } 
      } 
     }); 
     return city; 
} 
+0

첫 번째'도시 반환 "이전에 오류가 있습니다. 나는'city = addr.long_name'을 읽어야한다고 생각한다 -'='가 빠졌다. –

+1

서버에서 보낸 JSON 문자열과 '이상한'결과의 예를 게시하십시오. –

+0

나는 당신이 조건이 만족 될 때 즉시 값을 돌려 주어야한다고 생각한다. 루프를 완료하기 위해 기다릴 필요가 없습니다. –

답변

3

$ .getJson은 비동기 함수이므로 도시를 반환 한 다음 성공 함수가 실행된다 (t 그는 일했다). 당신이 원하는 것은 전화가 다시 오기를 기다리는 것입니다. 여기에 제가 생각하는 연기 jQuery를 사용하여,이 일을하는 좋은 방법입니다 :

function getCity(lat,lng) 
{ 
    var def = jQuery.Deferred(); 
var url="http://maps.googleapis.com/maps/api/geocode/json?latlng=" 
var sensor="&sensor=false"; 

var city; 
$.getJSON(url+lat+","+lng+sensor,function(json) 
    { 
     var address=json.results[0].address_components; 
     var addr; 
     for(var i in address) 
      { 
       addr=address[i]; 
       if(addr.types[0] == "locality" && addr.types[1] == "political") 
       { 
        city=addr.long_name; 

       } 
      } 
     def.resolve(city); 

     }); 
return def.promise(); 
} 

$.when(getCity(40.714623,-74.006605)).then(function (city) { 
alert(city); 
}); 

Fiddle

+0

Deferred/Promise는 jQuery의 ajax 함수에서 구워집니다. 자신 만의 Deferred 객체를 만들고 해결할 필요는 없습니다.필-R @ – Pratheep

+0

:에 잘 작동 '내 방화 광이 오류를 반환 Fiddle'but : '형식 오류 : jQuery.Deferred 생성자 VAR 데프 = 새로운 jQuery.Deferred() 아니다' 어떤 제안을? –

+1

'var def = jQuery.Deferred();'new가 없으면 시도하십시오 – Pratheep

0

콜백에 city을 반환하지 마십시오. 그냥 다음과 같이 지정하십시오 : city = addr.long_name;

getCity 범위 내에 있으므로 오른쪽으로 돌아와야합니다.

업데이트

변경하면 데이터를 요청하는 방식. 다음과 같이하십시오.

이는 비동기 호출이므로 완료된 후에 지정해야하기 때문입니다.

+0

시도했지만이 오류가 발생했습니다. 'TypeError : $ .getJSON (...). done이 함수가 아닙니다. ' 수정 해보십시오. –

1

getcity 그래서 당신이 작동

다른 옵션을 수행 할 콜백을 통과해야 ... 나중에 결과를해야합니다 비동기 호출 (해서 getJSON)를 사용하여 동기 호출을

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    async: false, 
    data: myData, 
    success: function(data) { 
    //stuff 
    } 
}); 

하지만 여전히 난을 사용하는 것입니다 브라우저가 결과까지 교수형에 처해지기 때문에 결과를 기다려서는 안되기 때문에 ... 콜백 접근 방식으로 이동하십시오.

1

해서 getJSON 비동기 호출입니다. 따라서 보통 함수처럼 getCity 값을 반환 할 수 없습니다. 귀하의 경우에 city은 getJSON이 값을 반환하기 전에 반환됩니다. 반환 값을 사용하려면 콜백 함수 내부에서 작업해야합니다.

그러나 jQuery의 지연/약속을 활용할 수 있으므로 콜백 함수를 자세히 살펴볼 필요가 없습니다. 아래 코드를 사용해보십시오.

function getCity(lat,lng) { 
    var url="http://maps.googleapis.com/maps/api/geocode/json?latlng="; 
    var sensor="&sensor=false"; 

    return $.getJSON(url+lat+","+lng+sensor); 
} 

function onSuccess(json) { 
    var address=json.results[0].address_components; 
    var addr; 
    var city; 

    for(var i in address) { 
     addr=address[i]; 
     if(addr.types[0] == "locality" && addr.types[1] == "political") { 
      city=addr.long_name; 
     } 
    } 

    // And do other stuff 
} 

function onfail() { 
    // Do something if there is a server error with the getJSON 
} 

getCity(lat, lng).done(onSuccess).fail(onfail);