0

関数 LoadXML() があり、サーバーへの ajax 呼び出しの後、100 個のアドレス タイプ文字列の配列を取得しました。

addmarkersここでも、関数をコールバックとして関数 extractAddressed() を呼び出します。

function loadXMLDoc(l)
    {    
      //making ajax call to the server to get the addresses

    arrayMyAddresses.push(rec[i][8] + "," + rec[i][10]);

    extractAddresses(addmarkerss);

    }

これは、Googleサーバーへの非同期呼び出しを実行するメソッドを 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するジオコーディング用のアドレスを 1 つずつ指定する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 に答える