我一直试图返回'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;
}
答案 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);
});
答案 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
});
这是因为它是一个异步调用,因此您希望在完成后分配它。