$("#btnsub").click(function () {
var add = $("#txtname").val();
var obj;
var geo = new google.maps.Geocoder;
geo.geocode({ 'address': add }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
obj = results[0].geometry.location;
obj = convert(obj);
alert(obj);
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
alert(obj);
// why this alert run first instead of the upper alert()
});
答案 0 :(得分:5)
geocode
函数是异步。
您传递的回调会在调用geocode
后运行一段时间; geocode
函数本身不会(也不能)等待响应。
答案 1 :(得分:4)
如果geo.geocode()
是一个AJAX请求,那么之后来的代码不会等待响应在执行之前返回。
因此,代码乱序运行。第二个alert()
发射,因为没有什么可以阻止它发射。第一个是在收到AJAX响应时触发的。
如果你有一些依赖于响应的其他代码,那么将该代码放在一个函数中,并从geo.geocode()
的回调内部调用它。
$("#btnsub").click(function () {
var add = $("#txtname").val();
var obj;
var geo = new google.maps.Geocoder;
geo.geocode({ 'address': add }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
obj = results[0].geometry.location;
obj = convert(obj);
alert(obj);
// Call a function that relies on the response
// and pass the obj to it.
someOtherFunction( obj );
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
});
function someOtherFunction( data ) {
alert( data );
// do something with the obj (referenced as data)
}
答案 2 :(得分:1)
可能是因为另一个是回调?这取决于.geocode
对它的作用,但很可能它可能是一个ajax回调。