定义JSONP回调函数

时间:2018-01-10 09:18:01

标签: javascript jquery ajax

我对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})

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

1 个答案:

答案 0 :(得分:2)

ajax来电中删除jsonpCallback: "parseResponse"。这让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文档(上面链接)。