我有一个调用 Google Geocoder API 来获取纬度和经度的函数。问题在于,在依赖于响应的代码执行完毕之后,响应来得太晚了。
这是我当前的代码。
var prmList = '';
prmList += '{"Empty":"","Criteria":""}';
$.ajax({
type: "POST",
url: window.location.pathname + "/GetAddress",
data: prmList,
async: false,
cache: true,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
var Alladd = eval('(' + msg.d + ')');
var itemcount = Alladd.returnAddressList.length;
if (itemcount > 0) {
for (i = 0; i < itemcount; i++) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
'address': Alladd.returnAddressList[i].Street + "," +
Alladd.returnAddressList[i].City + "," +
Alladd.returnAddressList[i].State + "," +
Alladd.returnAddressList[i].Country
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
position: results[0].geometry.location,
draggable: true,
icon: markerImage
});
markers.push(marker);
}
});
}
var zoom = parseInt(-1, 10);
var size = parseInt(-1, 10);
var style = parseInt(-1, 10);
zoom = zoom == -1 ? null : zoom;
size = size == -1 ? null : size;
style = style == -1 ? null : style;
markerClusterer = new MarkerClusterer(map, markers, {
maxZoom: zoom,
gridSize: size,
styles: styles[style]
});
}
},
error: AjaxFailed
});
最佳答案
首先,请格式化您的代码。
其次,你的代码在响应之前执行是什么意思?如果它依赖于 $.ajax
调用的返回,只需将该函数包含在 success
延续中即可。
啊,我想我明白你的问题 -
试试这个:
var itemcount = Alladd.returnAddressList.length;
if (itemcount > 0) {
for (i = 0; i < itemcount; i++) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
'address': Alladd.returnAddressList[i].Street + "," + <br>Alladd.returnAddressList[i].City + "," + Alladd.returnAddressList[i].State + "," + Alladd.returnAddressList[i].Country
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
position: results[0].geometry.location,
draggable: true,
icon: markerImage
});
markers.push(marker);
if(i == itemcount-1)
{
var zoom = parseInt(-1, 10);
var size = parseInt(-1, 10);
var style = parseInt(-1, 10);
zoom = zoom == -1 ? null : zoom;
size = size == -1 ? null : size;
style = style == -1 ? null : style;
markerClusterer = new MarkerClusterer(map, markers, {
maxZoom: zoom,
gridSize: size,
styles: styles[style]
});
}
}
});
}
}
您遇到的问题是您在运行脚本之前没有等待所有异步调用返回。此更改可确保您在继续操作之前获得最终的预期响应。
话虽如此,您可能想要引入一些错误检查 - 如果未返回响应或收到错误代码会发生什么?这些情况都应该检查。
关于javascript - 代码在 API 响应之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659001/