要忽略的Jquery Ajax错误处理已中止

要忽略的Jquery Ajax错误处理已中止,jquery,ajax,error-handling,Jquery,Ajax,Error Handling,我想为ajax调用提供一种全局错误处理方法,这就是我现在拥有的: $.ajaxSetup({ error: function (XMLHttpRequest, textStatus, errorThrown) { displayError(); } }); 我需要忽略中止的错误错误抛出为空,文本状态为错误。如何检查已中止?我发现当有中止的请求时,状态和/或读取状态等于0 在我的全局错误处理程序中,我在方法顶部有一个检查: $(document).ajaxError(functi

我想为ajax调用提供一种全局错误处理方法,这就是我现在拥有的:

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});

我需要忽略
中止的错误
<代码>错误抛出为空,
文本状态
错误
。如何检查
已中止

我发现当有中止的请求时,
状态
和/或
读取状态
等于
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
});

我发现这对我来说非常合适。希望这对您或遇到此问题的其他人有所帮助:)

您需要查看传递到错误函数中的textStatus参数。根据,它可以采用值“success”、“notmodified”、“error”、“timeout”、“abort”或“parserror”。“中止”显然是您要检查的内容


这里有更详细的说明:

我今天不得不处理相同的用例。我正在开发的应用程序有这些长时间运行的ajax调用,这些调用可能会被1)用户导航离开或2)某种临时连接/服务器故障中断。我希望错误处理程序仅在连接/服务器故障时运行,而不是在用户离开时运行

我首先尝试了Alastair Pitts的答案,但没有成功,因为中止的请求和连接失败都将状态代码和readyState设置为0。接下来,我尝试了西普的答案;也不起作用,因为在这两种情况下,没有给出响应,因此没有标题

唯一对我有效的解决方案是为window.onbeforeunload设置一个侦听器,它设置一个全局变量来指示页面已卸载。然后,错误处理程序可以检查并仅在页面尚未卸载时调用错误处理程序

var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
    globalVars.unloaded = true;
});
...
$.ajax({
    error: function(jqXHR,status,error){
        if (globalVars.unloaded)
            return;
    }
});
在此基础上,您还可以这样做以获得更多信息:

$(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);
        }
    }
});

我在这里遇到了同样的问题,作为解决方案,我所做的是在调用abort()之前设置一个“aborting”var,如下所示:

aborting = true;
myAjax.abort();
如果abort不是true,则只在ajax请求的错误处理程序上显示错误

$.ajax({
    [..]
    error: function() {
        if ( !aborting ) {
            // do some stuff..
        }
        aborting = false;
    }
});

由于bluecollarcoders answer不适用于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


现在ajaxError处理程序将忽略它。在现代jQuery中,您只需检查
请求。statusText
是否等于
'abort'

error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}

如果手动中止ajax请求,可以执行以下操作:

var-xhr;
函数queryData(){
if(xhr){
//标记它已被中止
xhr.hasborted=true;
//手动取消的请求
xhr.abort();
}
xhr=$.ajax({
url:“…”,
错误:函数(){
如果(!xhr.hasborted){
log('内部服务器错误!');
}
},
完成:函数(){
xhr=null;
}
});
}

如果ajax一开始无法连接到服务器,我将获得相同的状态和readyState。但这是我要处理的错误。仅中止不。是,这将掩盖您确实希望看到的其他错误。也没有帮助。对于中止的请求和到服务器的连接错误,响应头都是空的。@Clovisix是,上面的解决方案检查响应头是否为空,并支持令人恼火的错误消息。在我们运行的多个商业系统上运行良好。您能否提供更多详细信息,说明您试图实现的目标/您的问题是什么?如果我们的任何请求无法连接到服务器,我们将显示消息。我们没有在手动中止中显示它们,但最大的问题是当用户导航到下一页时,这会导致连接错误,并且无法区分中止的请求和连接错误。我通过在window.onbeforeunload上设置一个var解决了这个问题。它几乎可以检测到手动中止。这里还有更多的细节:我想我们只是玩弄了一下,并没有检测到我们收到的中止错误消息。对我来说,textStatus是“中止”。我知道这是一个老问题——也许它已经改变了。对我来说,这仍然是“错误”。是的,很遗憾,这取决于浏览器的不同。另请参见:(2017)如果您手动调用
abort
(我不确定何时会调用它),您可以传入错误消息:
abort(“abort”)
。如果ajax请求被Javascript中断,这将不起作用。这不是一个有效的答案。在“卸载前”中,可以取消卸载。如果发生这种情况,所有后续的Ajax错误都将被忽略。@丢失了用户定义的
beforeunload
处理程序。如果要用相同的方法取消卸载,为什么要将globalVars.unload设置为
true
?@bluecollarcoder我想说的是,如果你有一个大项目,面临这个问题,你必须先去解决所有问题,然后再卸载其中的handler,仅添加您提供的新页面是不够的。
beforeunload
在用户导航到另一个页面或调用太晚时不会被调用?在chrome中,我可以检查“中止”。在firefox中,我得到“错误”。@bluecollarcoder的解决方案似乎最适合我们。是的,这取决于浏览器(常见的web问题…)
handler = jQuery.get("foo")
handler.abort()
error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}