我想为ajax调用提供一种全局错误处理方法,这就是我现在所拥有的:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
我需要忽略的错误aborted
。errorThrown
为null,textStatus
为error
。我该如何检查aborted
?
我想为ajax调用提供一种全局错误处理方法,这就是我现在所拥有的:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
我需要忽略的错误aborted
。errorThrown
为null,textStatus
为error
。我该如何检查aborted
?
abort
手动致电(而且我不确定何时会调用),您可以传递错误消息:abort("abort")
。
Answers:
今天我不得不处理相同的用例。我正在处理的应用程序具有这些长时间运行的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;
}
});
beforeunload
处理程序是用户定义的。true
如果要以相同的方法取消卸载,为什么还要将globalVars.unloaded设置为?
beforeunload
当用户导航到另一个页面或被调用为时已晚时不会调用?
在现代jQuery中,您可以检查是否request.statusText
等于'abort'
:
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
我发现的是,当请求中止时,thestatus
和/或readyState
equal 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参数。根据http://api.jquery.com/jQuery.ajax/,它可以采用值“成功”,“未修改”,“错误”,“超时”,“中止”或“ parsererror”。“ 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;
}
...
}
例如
handler = jQuery.get("foo")
handler.abort()
现在将被ajaxError处理程序忽略
在Alastair Pitts'a答案的基础上,您也可以这样做以获得更多信息:
$(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);
}
}
});
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
if (!jqXHR.getAllResponseHeaders()) {
return;
}
});
如果您手动中止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;
}
});
}