私はしばらくこれに苦労してきました。私は Javascript を初めて使用し、私が書いたコードが非同期で実行されているという印象を受けました。一般的な例を次に示します。
関数 a でいくつかのコードを実行します。次に、関数 A は関数 B を呼び出します。関数 B は、変数を A に返して、A が後の操作で使用できるようにする必要があります。A が B を呼び出すと、戻り値がブロックされるのを待たずに独自のコードを実行し続け、A が戻り値を使用する必要があるポイントに到達するほど B は十分に高速ではないようです。値と未定義の変数型エラーが発生します。
私がこれを回避した方法は、関数Aが関数Bを呼び出し、次に関数Cを呼び出して、Aが戻り値で行う後の操作を実行することです....私は呼び出しを通じてコードをシリアル化しています返品の代わりに...それは面倒ですが...
実際のコードで発生する場合の例を次に示します。
function initialize() {
//Geocode Address to obtin Lat and Long coordinates for the starting point of our map
geocoder = new google.maps.Geocoder();
var results = geocode(geocoder);
makeMap(results[0].geometry.location.lat(), results[0].geometry.location.lng());
}
function geocode(geocoder) {
//do geocoding here...
var address = "3630 University Street, Montreal, QC, Canada";
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
return results;
}
else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
function makeMap(lat, long) {
// alert(lat); for debuging
var mapOptions = {
center: new google.maps.LatLng(lat, long),
zoom: 17,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
mapOptions);
}
注:初期化は、HTML の body onload="initialize()" によって呼び出されます。
したがって、問題は、makeMap が Geocode 関数によって取得された緯度と経度の値を必要とすることですが、結果が未定義であるというエラーがコンソールに表示されます。何が起こっている?私はJavaから来たので、ここでJSでデータフローがどのように起こっているかについて少し混乱しています! 今後の貴重な教訓となります!
副次的な質問:外部スクリプト間で関数を分割するにはどうすればよいですか? グッドプラクティスとは何ですか?すべての関数を 1 つの外部 .js ファイルに詰め込む必要がありますか、それとも同様の関数をグループ化する必要がありますか?