0

我正在尝试从 Web 服务获得响应,特别是将两个 WFS 图层从地理服务器添加到传单 Web 地图。每次添加第一层都没有问题,但是大多数时候,第二层失败,抱怨没有定义回调函数:

ReferenceError: getJson is not defined

但是让我很奇怪的是,第二层会被添加,只是有时。刷新页面并再次尝试几乎总是会失败。

这是进行ajax调用的代码:

$(document).ready(function() {

...

    $("#add-network-button").on("click", function() {setLocation("Moscow")}) 

    function setLocation(locationName) {

        var networkParameters = {
            service: 'WFS',
            version: '1.0.0',
            request: 'GetFeature',
            typeName: 'netex:' + locationData[locationName].networkWFSName,
            maxFeatures: 99999,
            outputFormat: 'text/javascript',
            format_options: 'callback: getJson'
        };

        addWebService(map, WFSURL, networkParameters)

        var buildingParameters = {
            service: 'WFS',
            version: '1.0.0',
            request: 'GetFeature',
            typeName: 'netex:' + locationData[locationName].buildingWFSName,
            maxFeatures: 99999,
            outputFormat: 'text/javascript',
            format_options: 'callback: getJson'
        };

        addWebService(map, WFSURL, buildingParameters)

    }

这是addWebService功能:

var addWebService = function(map, WFSURL, WFSParameters) {

    var leafletWFSParameters = L.Util.extend(WFSParameters);

    console.log(WFSURL + L.Util.getParamString(leafletWFSParameters));

    $.ajax({
        url: WFSURL + L.Util.getParamString(leafletWFSParameters),
        dataType: 'jsonp',
        jsonpCallback: 'getJson',
        success: handleJson,
        cache: false
    });

    // TODO: add style
    function handleJson(data) {
        L.geoJson(data, {}).addTo(map);
    }
}
4

1 回答 1

2

您正在使用jsonp,这意味着您返回的数据不是 JSON,而是调用全局定义函数(名称由 定义jsonpCallback)的 javascript 代码。

jQuery 自动创建一个具有该名称的函数,执行网络请求,并且当该函数运行时,它会从全局范围内销毁它自己的引用。

您正在addWebService()快速连续执行两个调用,这会触发两个 jQuery$.ajax({jsonpCallback: 'getJson'})调用。第二个调用是覆盖全局定义的getJson回调函数。当您的浏览器接收到第一个 jsonp 有效负载时,全局定义的getJson回调将被销毁。当接收到第二个 jsonp 有效负载时,它会尝试调用全局定义的getJson函数,但失败了。经典的比赛条件。

让我引用jQuery 的jsonpCallback参数 on$.ajax()的文档,强调我的:

jsonp回调

类型:字符串或函数()

指定 JSONP 请求的回调函数名称。将使用此值代替 jQuery 自动生成的随机名称。最好让 jQuery 生成一个唯一的名称,因为这样可以更轻松地管理请求并提供回调和错误处理。当您想要启用更好的 GET 请求浏览器缓存时,您可能需要指定回调。

我建议您要么使用 JSONP 以外的其他传输格式,要么为每个请求使用不同的回调名称。

于 2018-05-24T11:18:21.107 回答