我对JS有点陌生,我的代码有一些问题。

我有对服务器的Ajax请求,从中我得到了响应。由于这是跨域请求,因此我正在使用JSONP。

$.ajax({
    url: "***",
    contentType: 'application/javascript',
    dataType: "jsonp",
    jsonpCallback: "parseResponse"
  })
    .done(function (response) {
        doSomething();
    })
    .fail(function (error)) {
        console.log(error);
  }


我得到的回应:

parseResponse({...})


我的问题是了解parseResponse回调的工作方式。有了这段代码,我有时会得到


  “未捕获的ReferenceError:未定义parseResponse”。


但是部分响应通过OK(在.done函数中,我过滤响应并从那里填充表格)。

应该如何正确定义parseResponse?

编辑:
“ parseResponse”是Geoserver服务设置的默认回调。

响应示例:

parseResponse({"type":"FeatureCollection","totalFeatures":"unknown","features":[],"crs":null})


通常,features属性数组将填充一些数据。

最佳答案

从您的jsonpCallback: "parseResponse"通话中删除ajax。这使jQuery可以为您处理所有工作。 (它创建一个唯一的函数名称,创建该函数,将该名称传递给端点,并在完成后清除该函数。)

同时删除contentType: "application/javascript"。您没有将JavaScript代码发送到服务器。

$.ajax({
    url: "***", // <== Make sure this DOESN'T have ?callback= on it
    dataType: "jsonp"
})
.done(function(response) {
    doSomething();
})
.fail(function(error)) {
    console.log(error);
});




根据您的评论,目标服务(Geoserver)需要用于指定JSONP回调的荒谬选项:format_options=callback:name。这与ajax完全不兼容(而且我之前从未见过对JSONP的这种钝性支持)。

要在不使用硬编码名称的情况下进行处理(因为硬编码名称是一个坏主意,您不能重叠调用),我们必须玩以下愚蠢的游戏:

var callbackName = "myJSONPCallback" + Date.now() + Math.floor(Math.random() * 100000);
$.ajax({
    url: "//the-url?format_options=callback:" + callbackName,
    // Include ----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // in the URL
    dataType: "jsonp",
    jsonp: false,
    jsonpCallback: callbackName
})
.done(function(response) {
    doSomething();
})
.fail(function(error)) {
    console.log(error);
});


有关ajaxjsonp选项的详细信息,请参见jsonpCallback文档(上面链接)。

10-08 15:45