0

「都市」変数の値を返そうとしていますが、奇妙な結果が得られ続けています。コードに何か問題があるはずです。それが何であるかを理解するのを手伝ってくれることを願っています.

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;
}
4

4 に答える 4

3

$.getJson は非同期関数です。これは都市を返すことを意味し、成功関数が実行されます (呼び出しが機能した場合)。あなたが望むのは、電話が戻ってくるのを待つことです。jquery deferred を使用して、これを行う良い方法だと思うのは次のとおりです。

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);   
});

フィドル

于 2013-07-19T02:53:12.857 に答える
1

getJSON は非同期呼び出しです。getCityしたがって、通常の関数のように値を返すことはできません。あなたの場合、citygetJSONが値を返す前に返されます。戻り値を使用するには、コールバック関数内で作業する必要があります。

ただし、jQuery の deferred/promise を利用できるため、コールバック関数に深く入り込む必要はありません。以下のコードを試すことができます。

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);
于 2013-07-19T03:14:39.057 に答える