2

我正在使用 jQuery 1.9.1 对 Etsy API 执行 jsonp。下面是一个用于调用 API 的例程;它接受一个签名的请求(url)、一个 jsonp 回调名称和一个错误处理程序。

call: function (signedOAuthRequest, callback, errorFn) {
    $.ajax({
        url: signedOAuthRequest,
        type: "GET",
        dataType: "jsonp",
        jsonpCallback: callback,
        jsonp: false,
        crossDomain: true,
        cache: true,
        processData: false,
        error: function (jqXHR, textStatus, errorThrown) {
            if (errorFn != undefined) {
                errorFn(jqXHR, textStatus, errorThrown);
            }
        }
    });

用法:

call("http://the.api/?signedrequest", "myCallback", myErrorHandler);

它有效。myCallback触发,收到的 json 对象看起来不错。一切安好。

除了...

完成后myCallback,错误处理程序立即运行。在错误处理程序中,状态码为 200,错误消息为"parsererror". errorThrown.message 是"myCallback was not called". 事情是,肯定myCallback被调用并且传递给它的 json 对象被解析得很好,所以我根本不明白。

为什么在其他成功的调用中会引发此错误?

4

1 回答 1

1

根据评论和您的问题,这就是我编写该代码的方式:

function (signedOAuthRequest, callbackName, successFn, errorFn) {
    $.ajax({
        url: signedOAuthRequest,
        type: "GET",
        dataType: "jsonp",
        jsonpCallback: callbackName,
        jsonp: false,
        cache: true,
        success: successFn,
        error: function (jqXHR, textStatus, errorThrown) {
            if (typeof errorFn !== 'undefined') {
                errorFn(jqXHR, textStatus, errorThrown);
            }
        }
    });
}

我做了以下更改:

添加了一个附加参数来传递成功回调。这是必需的,因为 jQuery 将为您定义回调,以便它可以检索成功的响应并解析它。

删除crossdomain: true,因为它是多余的

已删除proccessData: false,因为它不影响 jsonp 请求并且您没有传递任何数据

添加success: successFn以便 jQuery 将successFn使用已解析的 json 数据成功执行。

将回调重命名为 callbackName 以便更清楚地了解它包含的内容。

如果您仍然坚持自己定义回调,另一种解决方案是使用脚本 dataType(取自下面的评论)

$.ajax({
    url: signedOAuthRequest,
    dataType: "script",
    cache: true
});
于 2013-06-21T22:27:06.487 回答