0

我有一个函数 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对谷歌服务器执行异步调用的方法进行 地理编码的部分地址的函数

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);


    }

在这里,您还可以看到addAddresstoMap处理来自 google 服务器的响应并创建 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还有我怎么能在没有*的情况下解决我的问题

4

1 回答 1

1

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

确实如此,地理编码是一个异步过程。

您必须在达到预期长度时调用addmarkerss()内部 (最后一个地理编码请求已完成)addAddressToMap()batch

于 2013-01-28T10:40:38.437 回答