Javascript 在传单映射中处理ajax请求

Javascript 在传单映射中处理ajax请求,javascript,jquery,ajax,leaflet,Javascript,Jquery,Ajax,Leaflet,我有一个非常基本的传单贴图,使用传单面板层创建一个漂亮的层控件。我有两个函数来创建我的图层和覆盖。我的数据在外部geoJSON文件中,这似乎是我的问题,因为传单并没有提供任何获取外部geoJSON的内容。我还使用proj4spoollibrary来使用json中给出的投影。 所以谷歌告诉我使用ajax,很遗憾,我对此一无所知。我复制粘贴了如下内容: function getOverlays(){ var url = 'myServerUrl'; overlays = [];

我有一个非常基本的传单贴图,使用
传单面板层
创建一个漂亮的层控件。我有两个函数来创建我的图层和覆盖。我的数据在外部geoJSON文件中,这似乎是我的问题,因为传单并没有提供任何获取外部geoJSON的内容。我还使用
proj4spool
library来使用json中给出的投影。 所以谷歌告诉我使用ajax,很遗憾,我对此一无所知。我复制粘贴了如下内容:

function getOverlays(){
    var url = 'myServerUrl';
    overlays = [];

    $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonpCallback: 'getJson',
        success: function(response) {
            overlays.push({
                name: "Something",
                layer: L.Proj.geoJson(response, {
                ...
                }
            });
        }
    });
    return overlays;
}
var map = L.map('map', {
    layers: layers[0].layer
});
var layers = getBaseLayers();
var overlays = getOverlays();
var panelLayers = new L.Control.PanelLayers(layers,overlays);
map.addControl(panelLayers);
我的地图是这样构建的:

function getOverlays(){
    var url = 'myServerUrl';
    overlays = [];

    $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonpCallback: 'getJson',
        success: function(response) {
            overlays.push({
                name: "Something",
                layer: L.Proj.geoJson(response, {
                ...
                }
            });
        }
    });
    return overlays;
}
var map = L.map('map', {
    layers: layers[0].layer
});
var layers = getBaseLayers();
var overlays = getOverlays();
var panelLayers = new L.Control.PanelLayers(layers,overlays);
map.addControl(panelLayers);
如果我想直接将图层添加到地图中,这实际上很好。但是在我的例子中,异步请求似乎在我的图层切换器被添加到我的地图之后准备就绪,这样图层就不会出现在那里。
有没有什么方法可以简单地解决这个问题而不必进行回调?

在请求完成后添加控件。这可以通过回调函数完成:

function getOverlays(callback){
    var url = 'myServerUrl';
    overlays = [];

    $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonpCallback: 'getJson',
        success: function(response) {
            overlays.push({
                name: "Something",
                layer: L.Proj.geoJson(response, {
                ...
                }
            });
            callback(overlays)
        }
    });
    return overlays;
}

var map = L.map('map', {
    layers: layers[0].layer
});
var layers = getBaseLayers();
getOverlays(function(overlays){
    var panelLayers = new L.Control.PanelLayers(layers,overlays);
    map.addControl(panelLayers);
});

在请求完成后添加控件。这可以通过回调函数完成:

function getOverlays(callback){
    var url = 'myServerUrl';
    overlays = [];

    $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonpCallback: 'getJson',
        success: function(response) {
            overlays.push({
                name: "Something",
                layer: L.Proj.geoJson(response, {
                ...
                }
            });
            callback(overlays)
        }
    });
    return overlays;
}

var map = L.map('map', {
    layers: layers[0].layer
});
var layers = getBaseLayers();
getOverlays(function(overlays){
    var panelLayers = new L.Control.PanelLayers(layers,overlays);
    map.addControl(panelLayers);
});

谢谢,对于一层来说效果很好-如果我有更多的层,比如说在for循环中会怎么样。在最后一层完成后,我如何初始化地图?我最好看看你的代码。无论如何,也要用同样的方法——创建一个标志,指示所有层都已加载(例如,如果您的循环已完成),如果您的标志变为
true
Thank,则调用回调函数,对于一个层来说效果很好——如果我有更多的层,比方说在for循环中会怎么样。在最后一层完成后,我如何初始化地图?我最好看看你的代码。无论如何,也要用同样的方法——创建一个标志,指示所有层都已加载(例如,如果循环已完成),如果标志变为
true