Sha*_*ean 77 ajax error-handling jquery
我想为ajax调用设置一个全局错误处理方法,这就是我现在拥有的:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
Run Code Online (Sandbox Code Playgroud)
我需要忽略错误aborted
.errorThrown
是null并且textStatus
是error
.我该如何查询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)
Udi*_*Udi 40
在现代jQuery中,您可以检查是否request.statusText
等于'abort'
:
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
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)
我发现这对我来说很完美.希望这可以帮助你,或任何遇到这个问题的人:)
小智 10
您将要查看传递给错误函数的textStatus参数.根据http://api.jquery.com/jQuery.ajax/,它可以取值"success","notmodified","error","timeout","abort"或"parsererror"."abort"显然是你想要检查的.
这里有更长的注释:jquery-gotcha-error-callback-triggered-on-xhr-abort
因为 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 处理程序忽略