我有一个函数LoadXML(),在调用服务器的ajax后,我得到一个包含100个地址类型字符串的数组;
此外,我们将函数extractAddressed()调用函数addmarkers
作为回调函数;
function loadXMLDoc(l)
{
//making ajax call to the server to get the addresses
arrayMyAddresses.push(rec[i][8] + "," + rec[i][10]);
extractAddresses(addmarkerss);
}
这是extractAddresses
函数,它使用getLocations
方法发送一部分我想要进行地理编码的地址,该方法对google服务器执行异步调用
function extractAddresses(callback)
{ alert (startman);
i=startman;
while (i<startman+intPageSize)
{
geocoder = new GClientGeocoder();
//alert(arrayMyAddresses[i]);
geocoder.getLocations(arrayMyAddresses[i], addAddressToMap);
i++;
}
//callback();
setTimeout(callback,300);
}
在这里,您还可以看到处理来自Google服务器的响应的函数addAddresstoMap
并创建一系列gmarkers!
function addAddressToMap(response)
{
if (!response || response.Status.code != 200)
{
alert("Sorry, we were unable to geocode that address");
}
else
{
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
var marker = new GMarker(point);
batch.push(marker);
//alert ("batchaddaddresstomap " + batch.length);
}
}
最后addmarkerss
()函数将Gmarkers数组添加到地图中;
function addmarkerss()
{
// alert("batchf: " + batch.length);
mgr = new MarkerManager(map);
mgr.addMarkers(batch,13);
mgr.refresh();
}
这就是程序应该如何运作的
当我打电话给extractAddresses
并逐一给出地址编码到addAddresstoMap
函数的地址时,它们被动态地添加到Gmarker类型的数组中;
当我准备好这个时,我调用addmarkers()将标记放在我的地图上;
但它实际上是什么
当我调用extractaddresses
时,它会以某种方式首先转到addmarkers
函数,它会看到banch
数组为空并且不加载任何标记;
当我放setTimeout(callback,300);
而我推迟addmarkers
的执行时,一切正常。
可能是什么原因。我还想问问题是否在这里:
虽然如果回调函数放在函数的最后一个函数中,它确实会在最后执行,但这似乎并不总是会发生。例如,如果函数包含某种异步执行(* 就像Ajax调用,因为它是我的情况 ),那么回调将在异步操作之后执行开始,但可能在它结束之前。是我的情况吗?如何在没有settimeout
*
答案 0 :(得分:1)
如果函数包含某种异步执行(就像我的情况那样是Ajax调用),那么回调将在异步操作开始后执行,但可能在它完成之前执行。 是我的情况吗?
情况就是这样,地理编码是一个异步过程。
当 addmarkerss()
达到预期的长度时,您必须在 addAddressToMap()
内拨打 batch
(最后的地理编码请求已经完成)