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