jQuery ajax jsonp成功后调用错误



我使用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。消息为"myCallback was not called"。问题是,myCallback确实被调用了,传递给它的json对象被解析得很好,所以我根本没有得到这个。

为什么在一个成功的调用上抛出这个错误?

基于评论和你的问题,这是我将如何编写代码:

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在成功解析json数据时执行successFn

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

如果你仍然坚持自己定义回调,另一个解决方案是使用脚本dataType(取自下面的注释)

$.ajax({
    url: signedOAuthRequest,
    dataType: "script",
    cache: true
});

相关内容

  • 没有找到相关文章

最新更新