以下の実行順序は分かりません。大きなスクリプトのこの部分ですが、$("#select-overlay")
がこれを開始します。JavaScriptの実行順序
function findSelectedMap(mapID) {
$.getJSON('maps.json', function (json) {
json.forEach(function (entry) {
if (entry.maps.id == mapID) {
changeLayerTo = entry.maps.url;
maxZoom = entry.maps.zoom;
} // end if
}); // end json.forEach
}); // end $.getJSON
} // end findSelectedMap
function overlaySelector() {
$("#select-overlay").change(function() {
mapID = $("#select-overlay input[type='radio']:checked").val();
findSelectedMap(mapID); // using mapID, find the url, zoom for overlayMap selected
currentLayer = L.tileLayer(changeLayerTo).addTo(map);
// more map stuff
}); // end $("#select-overlay").
} // end overlaySelector function
overlaySelector
ときのRailsアプリでページのロードが
<script>
$(document).on("turbolinks:load", function()
{
overlaySelector();
});
</script>
私はchangeLayerTo
がcurrentLayer = L.tileLayer(changeLayerTo).addTo(map);
前にライン5 に設定されるべきだと思うと呼ばれているが実行されます。 findSelectedMap(mapID)
関数が入力されました(私はたくさんのconsole.logを追跡しています)。そして、実行はcurrentLayer = L.tileLayer(changeLayerTo).addTo(map);
行にジャンプします(そしてエラーが発生しましたが、すぐ上にchangeLayerTo
を手動で定義して実行し続けることができ、json.forEach(function(entry)
行が実行され反復
私は何が欠けていますか?当初はfindSelectedMap(mapID)
がoverlaySelector
機能に組み込まれていましたが、それが役立つかどうか確認するために引き出しましたすべての変数は関数の外で宣言されていますが、私は最良の方法で問題に近づいているとは思いませんが、URLとズームが必要です。 )。
あなたはおそらく、 'change'イベントを含む' overlaySelector() 'を呼び出すでしょう。もちろん、 '#select-overlay'の' change'イベントが発生しインターセプトされると、 'changeLayerTo'が代入される前にコードが実行されます。 '$ .getJSON'も非同期であり、そのことを念頭におくのが最良です。 – Adriani6
関数が呼び出されるまで関数は起動しません。 –
ここでは非同期呼び出しが問題です。 '$ .getJSON'が実行されている間、すぐにcurrentLayerを割り当てます。 – Ele