我想为ajax调用设置一个全局错误处理方法,这就是我现在所拥有的:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
我需要忽略aborted
的错误。 errorThrown
为空,textStatus
为error
。如何查看aborted
?
答案 0 :(得分:49)
我今天必须处理相同的用例。我正在处理的应用程序有这些长时间运行的ajax调用可以被1)用户导航或2)某种临时连接/服务器故障中断。我希望错误处理程序仅针对连接/服务器故障运行,而不是针对导航的用户运行。
我首先尝试了Alastair Pitts的回答,但它没有用,因为中止的请求和连接失败都将状态代码和readyState设置为0.接下来,我尝试了sieppl的答案;也没有用,因为在这两种情况下都没有给出任何反应,因此没有标题。
对我有用的唯一解决方案是为window.onbeforeunload设置一个监听器,它设置一个全局变量来指示页面已被卸载。然后,错误处理程序可以检查并仅在页面尚未卸载时才调用错误处理程序。
var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
globalVars.unloaded = true;
});
...
$.ajax({
error: function(jqXHR,status,error){
if (globalVars.unloaded)
return;
}
});
答案 1 :(得分:37)
在现代jQuery中,您只需检查request.statusText
是否等于'abort'
:
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
答案 2 :(得分:21)
我发现的是,当中止请求时,status
和/或readyState
等于0
。
在我的全局错误处理程序中,我在方法的顶部进行了检查:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
//If either of these are true, then it's not a true error and we don't care
if (jqXHR.status === 0 || jqXHR.readyState === 0) {
return;
}
//Do Stuff Here
});
我发现这对我来说很完美。希望这可以帮助您或遇到此问题的任何其他人:)
答案 3 :(得分:10)
您需要查看传递给错误函数的textStatus参数。根据{{3}},它可以取值“success”,“notmodified”,“error”,“timeout”,“abort”或“parsererror”。 “abort”显然是你想要检查的。
此处有更长的注释:http://api.jquery.com/jQuery.ajax/
答案 4 :(得分:4)
因为bluecollarcoders的回答不适用于javascript中止的ajax请求,所以这是我的解决方案:
var unloaded = false;
...
$(window).bind('beforeunload', function(){
unloaded = true;
});
$(document).ajaxError(function(event, request, settings) {
if (unloaded || request.statusText == "abort") {
return;
}
...
}
e.g。
handler = jQuery.get("foo")
handler.abort()
现在将被ajaxError处理程序
忽略答案 5 :(得分:3)
在Alastair Pitts'a answer的基础上,您还可以执行此操作以获得更多信息:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError)
{
{
if (jqXHR.status === 0)
{
alert('Not connect.\n Verify Network.');
} else if (jqXHR.status == 404)
{
alert('Requested page not found. [404]');
} else if (jqXHR.status == 500)
{
alert('Internal Server Error [500].');
} else if (exception === 'parsererror')
{
alert('Requested JSON parse failed.');
} else if (exception === 'timeout')
{
alert('Time out error.');
} else if (exception === 'abort')
{
alert('Ajax request aborted.');
} else
{
alert('Uncaught Error.\n' + jqXHR.responseText);
}
}
});
答案 6 :(得分:2)
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
if (!jqXHR.getAllResponseHeaders()) {
return;
}
});
答案 7 :(得分:0)
我在这里遇到了同样的问题,我所做的解决办法就是在调用abort()之前设置一个“aborting”var,如下所示:
aborting = true;
myAjax.abort();
并且只显示ajax请求的错误处理程序的错误,如果abort不为true。
$.ajax({
[..]
error: function() {
if ( !aborting ) {
// do some stuff..
}
aborting = false;
}
});
答案 8 :(得分:0)
快速(和肮脏)解决方案:
if (status === 0) { // or -1 depending on where you do this
setTimeout(function() {
// error handling here
}, 2000); // 2 seconds, or use more ...
}
如果xhr错误状态为0(*),则在错误处理代码周围设置2秒的延迟,到那时浏览器已经加载了新的页面上下文,错误将永远不会显示。
如果错误不是由于导航到另一个页面而导致的中止错误,则会显示错误。
*注意:根据使用的库和您使用的错误处理程序,它可能是-1而不是零(Angular ...)或其他完全。
重要提示:状态文本可能因浏览器而异,并且使用了库,因此恕我直言,您不能依赖它,如果您找到跨浏览器解决方案,请在评论中告诉我
答案 9 :(得分:0)
如果您手动中止ajax请求,则可以执行以下操作:
var xhr;
function queryData () {
if (xhr) {
// tag it's been aborted
xhr.hasAborted = true;
// manually canceled request
xhr.abort();
}
xhr = $.ajax({
url: '...',
error: function () {
if (!xhr.hasAborted) {
console.log('Internal Server Error!');
}
},
complete: function () {
xhr = null;
}
});
}