我正在使用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对象被解析得很好,所以我根本没有得到它。
为什么在一次成功的通话中会抛出此错误?
答案 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
});