我正在制作ajax jsonp请求,但失败错误处理不起作用。如果请求是404或500,它将无法处理错误。
我一直在寻找答案,但找不到任何答案。似乎有http://code.google.com/p/jquery-jsonp/的解决方案,但我找不到任何关于如何使用它的示例。
function authenticate(user, pass) {
$.ajax ({
type: "POST",
url: "url",
dataType: 'jsonp',
async: false,
//json object to sent to the authentication url
data: {"u": userid, "p": pass},
success: function (data) {
//successful authentication here
console.log(data);
},
error: function(XHR, textStatus, errorThrown) {
alert("error: " + textStatus);
alert("error: " + errorThrown);
}
})
}
答案 0 :(得分:53)
如果您选中jQuery.ajax() documentation,则可以找到:
错误
请求失败时要调用的函数(...)注意:对于跨域脚本和跨域JSONP请求,此处理程序不。这是一个Ajax事件。
因此,您不得不找到解决方法。您可以指定超时以触发错误回调。这意味着在指定的时间范围内,请求应该成功完成。否则,假设它失败了:
$.ajax({
...
timeout: 5000, // a lot of time for the request to be successfully completed
...
error: function(x, t, m) {
if(t==="timeout") {
// something went wrong (handle it)
}
}
});
代码中的其他问题......
虽然可以使用JSONP(外观here和here)来克服原始政策限制,但您无法使用JSONP进行POST(请参阅CORS),因为它只是doesn't work that way - 它创建了一个获取数据的元素,这必须通过GET请求来完成。 JSONP解决方案不使用XmlHttpRequest对象,因此它不是标准理解方式的AJAX请求,但内容仍然是动态访问的 - 对最终用户没有区别。
$.ajax({
url: url,
type: "GET"
dataType: "jsonp",
...
其次,您提供的数据不正确。您正在将javascript对象(使用对象文字创建)推送到线路而不是其序列化的JSON表示。创建JSON字符串(不是手动,使用例如JSON.stringify
转换器):
$.ajax({
...
data: JSON.stringify({u: userid, p: pass}),
...
上一期,您已将async
设置为false
,而文档说明:
跨域请求和dataType:“jsonp”请求不支持 同步操作。
答案 1 :(得分:36)
处理错误的两种方法,
跨域JSONP请求没有错误处理。使用Github https://github.com/jaubourg/jquery-jsonp上提供的jsonp插件,该插件提供错误处理支持。
jQuery ajax Timeout - 在一段合理的时间后触发错误回调,因为它可能无声地失败。您可能不知道实际错误(或错误状态)是什么,但至少您可以处理错误
答案 2 :(得分:10)
我一直在努力尝试处理ajax jsonp DataType请求上的错误,但是我想分享你的代码,希望它有所帮助。一个基本的事情是在ajax请求中包含超时,否则它将永远不会输入错误:function
$.ajax({
url: "google.com/api/doesnotexists",
dataType: "jsonp",
timeout: 5000,
success: function (parsed_json) {
console.log(parsed_json);
},
error: function (parsedjson, textStatus, errorThrown) {
console.log("parsedJson: " + JSON.stringify(parsedjson));
$('body').append(
"parsedJson status: " + parsedjson.status + '</br>' +
"errorStatus: " + textStatus + '</br>' +
"errorThrown: " + errorThrown);
}
});
jsfiddle - Handle Errors with jquery ajax call and JSONP dataType - Error 404
答案 3 :(得分:2)
我正在构建一个使用jquery-jsonp的脆弱JS项目,并提出了一种双jsonp / ajax方法,无论哪种方法最终被使用,都会处理错误。
function authenticate(user, pass) {
var ajax = ($.jsonp || $.ajax)({
'url': /* your auth url */,
'data': { /* user, pass, ... */ },
'contentType': "application/javascript",
'dataType': 'jsonp',
'callbackParameter': 'callback' // $.jsonp only; $.ajax uses 'jsonpCallback'
});
ajax.done(function (data) {
// your success events
});
ajax.fail(function (jqXHR, textStatus, errorThrown) {
// $.jsonp calls this func as function (jqXHR, textStatus)
// and $.ajax calls this func with the given signature
console.error('AJAX / JSONP ' + textStatus + ': ' +
(errorThrown || jqXHR.url));
});
}
由于jquery-jsonp和$ .ajax都支持jQuery Deferred规范,我们可以将两个错误处理程序合并在一起,处理400和500系列错误,以及查找超时。
答案 4 :(得分:0)
老问题,但我遇到了同样的问题。这是一个对我有用的解决方案。
如果您拥有您拍摄请求的域名,则可以在响应中设置变量并在客户端进行检查。
服务器端:
SERVER_RESPONSE=true; Callback(parameter1, parameter2);
客户端:
if(typeof SERVER_RESPONSE === 'undefined'){
console.log('No Response, maybe server is down');
}
else{
console.log('Got a server response');
}