関数 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
また、 *なしで問題を解決するにはどうすればよいですか