从Jquery函数中获取价值

时间:2013-07-19 02:28:38

标签: jquery function

我一直试图返回'city'变量的值,但我仍然保持奇怪的结果,我知道我的代码一定有问题,我希望你能帮我弄清楚它是什么。

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 个答案:

答案 0 :(得分: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);   
});

Fiddle

答案 1 :(得分:1)

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

另一个选项是使用同步调用

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

但我仍然觉得,你不应该等待结果,因为浏览器会被挂起直到结果......所以请回复一下...

答案 2 :(得分:1)

getJSON是一个异步调用。因此,您无法像通常的函数那样从getCity返回值。在您的情况下,将在getJSON返回任何值之前返回city。您需要在回调函数内部使用返回值。

但是你可以利用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);

答案 3 :(得分:0)

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

因为它仍然在getCity范围内,所以它应该正确返回。

<强>更新

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

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

           //Do your assignment here
 });

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