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像通常的函数一样返回值。在您的情况下city,将在 getJSON 返回任何值之前返回。您需要在回调函数内部工作才能使用返回值。

但是您可以利用 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 回答
1

getcity 正在使用异步调用(getJSON),稍后会有结果......所以你应该传递回调来执行操作

另一种选择是使用同步调用

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

但我仍然觉得,你不应该等待结果,因为浏览器将被挂起直到结果......所以使用回调方法......

于 2013-07-19T02:44:29.573 回答
0

不要city在回调中返回。只需像这样分配它:city = addr.long_name;

由于它仍在 getCity 范围内,因此它应该正确返回。

更新

更改请求数据的方式。像这样做:

 $.getJSON(url+lat+","+lng+sensor).done(function(json){

           //Do your assignment here
 });

这是因为它是一个异步调用,因此您希望在它完成后对其进行分配。

于 2013-07-19T02:35:39.800 回答