Подтвердить что ты не робот

Обработка ошибок JQuery Ajax для игнорирования прерывания

Я хочу иметь глобальный метод обработки ошибок для вызовов ajax, вот что у меня есть сейчас:

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

Мне нужно проигнорировать ошибку aborted. errorThrown имеет значение null, а textStatus - error. Как проверить aborted?

4b9b3361

Ответ 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;
    }
});