jQuery ajax jsonp成功后调用错误

时间:2013-06-21 00:21:00

标签: json jquery cross-domain 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.message是"myCallback was not called"。事实是,myCallback 肯定是被调用,并且传递给它的json对象被解析得很好,所以我根本没有得到它。

为什么在一次成功的通话中会抛出此错误?

1 个答案:

答案 0 :(得分: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在成功时使用已解析的json数据执行successFn

将回调重命名为callbackName,以便它更明显地包含它。

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

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