Обработка ошибок JQuery Ajax для игнорирования прерывания
Я хочу иметь глобальный метод обработки ошибок для вызовов ajax, вот что у меня есть сейчас:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
Мне нужно проигнорировать ошибку aborted
. errorThrown
имеет значение null, а textStatus
- error
. Как проверить aborted
?
Ответы
Ответ 1
Сегодня мне пришлось иметь дело с одним и тем же прецедентом. Приложение, над которым я работаю, имеет эти длительные вызовы 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;
}
});
Ответ 2
В современном jQuery вы можете просто проверить, равно ли request.statusText
'abort'
:
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
Ответ 3
Я обнаружил, что когда есть прерванный запрос, status
и/или readyState
равны 0
.
В моем глобальном обработчике ошибок у меня есть проверка вверху метода:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
//If either of these are true, then it not a true error and we don't care
if (jqXHR.status === 0 || jqXHR.readyState === 0) {
return;
}
//Do Stuff Here
});
Я нашел, что это отлично работает для меня. Надеюсь, это поможет вам или любому другому, кто сталкивается с этим:)
Ответ 4
Вам нужно посмотреть на аргумент textStatus, переданный в вашу функцию ошибки. Согласно http://api.jquery.com/jQuery.ajax/, он может принимать значения "успех", "немодифицированный", "ошибка", "тайм-аут", "прерывание", или "parsererror". "abort" - это, очевидно, то, что вы хотите проверить.
Более длинные заметки здесь: jquery-gotcha-error-callback-triggered-on-xhr-abort
Ответ 5
Поскольку ответ bluecollarcoders не работает для запросов ajax, прерванных javascript, вот мое решение:
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
Ответ 6
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
if (!jqXHR.getAllResponseHeaders()) {
return;
}
});
Ответ 7
Основываясь на ответ 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);
}
}
});
Ответ 8
У меня была одна и та же проблема, и я решил как "прервать" var перед вызовом функции abort(), как показано ниже:
aborting = true;
myAjax.abort();
и показывать только ошибку в обработчике ошибок запроса ajax, если прервать это неверно.
$.ajax({
[..]
error: function() {
if ( !aborting ) {
// do some stuff..
}
aborting = false;
}
});