我使用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
});