Jquery Ajax错误处理忽略中止

时间:2011-01-26 17:11:13

标签: jquery ajax error-handling

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

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

我需要忽略aborted的错误。 errorThrown为空,textStatuserror。如何查看aborted

10 个答案:

答案 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;
        }
    });
}