JavaScript

时间:2017-12-31 01:10:15

标签: javascript json

我无法理解以下的执行顺序。这是一个较大的脚本的一部分,但是$( "#select-overlay" )开始了。

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
在页面加载Rails应用程序时调用

overlaySelector

<script>
  $(document).on("turbolinks:load", function() 
  {
     overlaySelector();
  });
</script>

我认为应该在执行 changeLayerTo之前在第5行设置currentLayer = L.tileLayer(changeLayerTo).addTo(map);。输入findSelectedMap(mapID)函数(我有一堆console.logs要跟踪),然后执行跳转到currentLayer = L.tileLayer(changeLayerTo).addTo(map);行(和错误,但我在上面手动定义changeLayerTo执行可以继续,然后json.forEach(function(entry)行执行并迭代maps.json中的十几个条目并找到正确的值。但当然我需要更快的值。

我错过了什么?最初findSelectedMap(mapID)嵌入在overlaySelector函数中,但是我把它拉出来看看它是否会有所帮助,而且它似乎更清晰。所有变量都在函数外声明。我无法想象我是以最好的方式解决问题,但我需要网址和缩放(最后还有一些与地图相关的其他数据)。

1 个答案:

答案 0 :(得分:2)

请尝试以下操作:

currentLayer = L.tileLayer(changeLayerTo).addTo(map);

基本上,cb param是一个回调函数,它将在forEach循环结束后执行,然后这行changeLayerTo将使用正确的def pip_calc(open, close): if str(open).index('.') >= 3: # JPY pair multiplier = 0.01 else: multiplier = 0.0001 pips = round((close - open) / multiplier) return int(pips) pip_calc(112.65, 112.68) # 3 pip_calc(1.6566, 1.6568) # 2

更新 - 正如@Adriani6建议的那样:你应该通过回调传回变量,而不是全局地将它们分配给窗口对象,当然,如果它们不需要是全局的