Jquery Ajax错误处理忽略中止

Sha*_*ean 77 ajax error-handling jquery

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

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});
Run Code Online (Sandbox Code Playgroud)

我需要忽略错误aborted.errorThrown是null并且textStatuserror.我该如何查询aborted

blu*_*der 51

我今天不得不处理相同的用例.我正在处理的应用程序有这些长时间运行的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;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 如果ajax请求被JavaScript中断,这不起作用 (3认同)

Udi*_*Udi 40

在现代jQuery中,您可以检查是否request.statusText等于'abort':

error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在chrome中,我可以检查"abort".在Firefox中,我得到"错误".来自@bluecollarcoder的解决方案对我们来说似乎是最好的. (4认同)

Ala*_*tts 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
});
Run Code Online (Sandbox Code Playgroud)

我发现这对我来说很完美.希望这可以帮助你,或任何遇到这个问题的人:)

  • 如果ajax无法连接到服务器,我会得到相同的状态和readyState.但这是我想要处理的错误.只是不流产了. (3认同)

小智 10

您将要查看传递给错误函数的textStatus参数.根据http://api.jquery.com/jQuery.ajax/,它可以取值"success","notmodified","error","timeout","abort"或"parsererror"."abort"显然是你想要检查的.

这里有更长的注释:jquery-gotcha-error-callback-triggered-on-xhr-abort


San*_*o J 5

因为 bluecollarcoders 的回答对 javascript 中止的 ajax 请求不起作用,这是我的解决方案:

var unloaded = false;
...
$(window).bind('beforeunload', function(){
    unloaded = true;
});


$(document).ajaxError(function(event, request, settings) {
    if (unloaded || request.statusText == "abort") {
        return;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

例如

handler = jQuery.get("foo")
handler.abort()
Run Code Online (Sandbox Code Playgroud)

现在将被 ajaxError 处理程序忽略