从Jquery函数中获取值
我一直在尝试返回'city'变量的值,但我不断发现奇怪的结果,我知道我的代码一定有问题,我希望你能帮我找出它是什么从Jquery函数中获取值,jquery,function,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) {
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;
}
不要在回调中返回
city
。按如下方式分配:
城市=地址长\名称
因为它仍然在getCity范围内,所以应该正确返回
更新
更改请求数据的方式。这样做:
$.getJSON(url+lat+","+lng+sensor).done(function(json){
//Do your assignment here
});
这是因为它是一个异步调用,所以您希望在完成后分配它。不要在回调中返回
city
。按如下方式分配:
城市=地址长\名称
因为它仍然在getCity范围内,所以应该正确返回
更新
更改请求数据的方式。这样做:
$.getJSON(url+lat+","+lng+sensor).done(function(json){
//Do your assignment here
});
这是因为它是一个异步调用,所以您希望在完成后分配它。getcity正在使用异步调用(getJSON),稍后会有结果。。。所以您应该传递将执行该操作的回调 另一种选择是使用同步调用
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
//stuff
}
});
但我仍然觉得,你们不应该等待结果,因为浏览器将被挂起,直到结果。。。所以使用回调方法…getcity正在使用异步调用(getJSON),这将在稍后产生结果。。。所以您应该传递将执行该操作的回调 另一种选择是使用同步调用
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
//stuff
}
});
但我仍然觉得,你们不应该等待结果,因为浏览器将被挂起,直到结果。。。因此,使用回调方法…$。getJson是一个异步函数,这意味着您将返回城市,然后执行success函数(如果调用成功)。你要做的是等电话回来。我认为使用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);
});
$.getJson是一个异步函数,这意味着您返回城市,然后执行success函数(如果调用成功)。你要做的是等电话回来。我认为使用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);
});
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);
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);
第一次
返回城市之前发生错误。我认为应该是city=addr.long\u name
-您缺少=
。请发布服务器发送的JSON字符串,以及一个“奇怪”结果的示例。我认为您应该在满足条件后立即返回值。您不需要等待完成循环。我认为getcity无法返回准确的结果,因为它的异步调用(ajax),稍后将有结果。。。所以你应该通过回调来执行操作…@Mike W:我的JSON没有问题,我使用的是console.log(city)代码>位于city=addr.long\u name旁边代码>并且我得到了正确的值。在您第一次返回城市之前有一个错误。我认为应该是city=addr.long\u name
-您缺少=
。请发布服务器发送的JSON字符串,以及一个“奇怪”结果的示例。我认为您应该在满足条件后立即返回值。您不需要等待完成循环。我认为getcity无法返回准确的结果,因为它的异步调用(ajax),稍后将有结果。。。所以你应该通过回调来执行操作…@Mike W:我的JSON没有问题,我使用的是console.log(city)代码>位于city=addr.long\u name旁边代码>我得到了正确的值。我尝试了,但是我得到了这个错误,TypeError:$.getJSON(…)。done不是一个函数
请尝试更正它。我尝试了,但是我得到了这个错误,TypeError:$.getJSON(…)。done不是一个函数
请尝试更正它。延迟/Promise在jQuery的ajax函数中烘焙。您不需要创建和解析自己的延迟对象。@Phil-R:在Fiddle
上工作正常,但我的firebug返回以下错误:TypeError:jQuery.Deferred不是构造函数var def=new jQuery.Deferred()代码>有什么建议吗?试试var def=jQuery.Deferred()代码>没有新的
是的,我的错,没有新的就做吧。我将编辑帖子和提琴。这两个表达式都有效我刚刚有一个旧版本的jquery,它有效。谢谢大家。延迟/Promise在jquery的ajax函数中烘焙。您不需要创建和解析自己的延迟对象。@Phil-R:在Fiddle
上工作正常,但我的firebug返回以下错误:TypeError:jQuery.Deferred不是构造函数var def=new jQuery.Deferred()代码>有什么建议吗?试试var def=jQuery.Deferred()代码>没有新的
是的,我的错,没有新的就做吧。我会编辑帖子和提琴。这两个表达式都有效。我刚刚有一个旧版本的jquery,它有效。谢谢大家。