使用Jquery Ajax进行错误处理以忽略已中止的请求。

11 浏览
0 Comments

使用Jquery Ajax进行错误处理以忽略已中止的请求。

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

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

我需要忽略aborted的错误。 errorThrown是null,textStatuserror。我如何检查aborted

0
0 Comments

Jquery Ajax错误处理程序忽略中止的原因是因为应用程序中存在长时间运行的Ajax调用,这些调用可能会被用户导航或临时连接/服务器故障中断。需要让错误处理程序仅在连接/服务器故障时运行,而不是在用户导航时运行。最初尝试了Alastair Pitts的答案,但由于中止请求和连接故障都会将状态码和就绪状态设置为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;
    }
});

如果一个Ajax请求被JavaScript中断,则此解决方法无效。如果取消了卸载,则不会调用beforeunload处理程序。为什么在相同的方法中设置globalVars.unloaded为true,如果你要取消卸载?我只是说,如果你有一个大项目,在这个问题上遇到了困难,你必须去修复它中的所有beforeunload处理程序,仅添加你提供的一个新的处理程序是不够的。当用户导航到另一个页面时,beforeunload不会被调用,或者调用太晚了?

0
0 Comments

在现代的jQuery中,可以通过检查request.statusText是否等于'abort'来解决该问题。在Chrome浏览器中,可以检查是否为"abort",而在Firefox浏览器中,会返回"error"。根据所提供的解决方案,这似乎是对我们来说最好的解决方法。这取决于不同的浏览器(通常的网络问题...)。

0
0 Comments

有时候在发生请求中止时,状态status和/或就绪状态readyState会等于0

在我的全局错误处理程序中,我在方法的顶部添加了一个检查:

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
    // 如果其中任何一个为真,则不是真正的错误,我们不关心
    if (jqXHR.status === 0 || jqXHR.readyState === 0) {
        return;
    }
    // 在这里处理错误
});

我发现这对我来说完全有效。希望这对你或其他遇到这个问题的人有所帮助 🙂

如果无法连接到服务器,我得到的状态和就绪状态也是相同的。但这是我想要处理的错误,只是不想处理中止的错误。

是的,这会掩盖其他你想要看到的错误。

0