为什么我的程序首先执行函数addmarkers() - 而不是addAddresstoMap()

时间:2013-01-28 10:01:56

标签: javascript google-maps callback google-maps-api-2

我有一个函数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 *

的情况下解决我的问题

1 个答案:

答案 0 :(得分:1)

如果函数包含某种异步执行(就像我的情况那样是Ajax调用),那么回调将在异步操作开始后执行,但可能在它完成之前执行。 是我的情况吗?

情况就是这样,地理编码是一个异步过程。

addmarkerss() 达到预期的长度时,您必须在 addAddressToMap() 内拨打 batch (最后的地理编码请求已经完成)