JQuery AJAX запускает обратный вызов ошибок при выгрузке окна - как отфильтровать выгрузку и отлавливать только реальные ошибки?

Должен ли я самостоятельно определять DEBUG и изменять его каждый раз, когда я изменяю объект Building-Target, или есть слово, которое я не знаю?

I не знаю, что, если по умолчанию установлено значение Code :: Blocks. Но, если вы определяете свои собственные #defines

Project->Build options...->[Debug|Release]->#defines 

, вам не нужно их менять при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, характерные для сборки Release.

Чтобы избежать необходимости вручную вводить его каждый раз для каждого нового проекта, вы можете сделать небольшой проект только с вашими параметрами Debug / Release #defines и сохраните их как шаблон проекта, а затем создайте новые проекты из этого шаблона проекта.

29
задан Chris 8 July 2014 в 17:49
поделиться

5 ответов

В обратном вызове ошибки или $. Ajax у вас есть три входных аргумента:

function (XMLHttpRequest, textStatus, errorThrown) {
   this; // options for this ajax request
}

Вы можете напрямую проверить xhr.status, чтобы получить код ответа HTTP, например:

$.ajax({
  url: "test.html",
  cache: false,
  success: function(html){
    $("#results").append(html);
  },
  error: function (xhr, textStatus) {
    if (xhr.status == 500) {
      alert('Server error: '+ textStatus);
    }
  }
});

Редактировать: Чтобы определить разницу между разрывом соединения браузером и случаем, когда сервер не работает (комментарий Джейсонмерино):

При выгрузке значение xhr.readyState должно быть равно 0, а для сервера без отклика значение xhr.readyState должно быть равно 4.

24
ответ дан Cebjyre 8 July 2014 в 17:49
поделиться

(Я бы добавил это как комментарий к основному ответу, но пока не набрал достаточно очков, чтобы сделать это!)

Я также вижу это в FF4 и хром (9.0.597.107). Вероятно, в другом месте, но этого достаточно, чтобы я захотел это исправить!

Одна из странностей в этой ситуации - возвращение XMLHttpRequest.status === 0

, который выглядит как надежный способ обнаружить эту ситуацию и, в моем конкретном случае, прервать пользовательскую обработку ошибок, отображаемую для пользователя:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    if (XMLHttpRequest.status === 0) return;
    // error handling here
}

Также стоит упомянуть, что в предположении, что может быть проблема в синтаксическом анализе JSON любого браузер возвращает вызов $ .ajax (), я также попытался обменять собственный JSON.stringify для версии Дугласа Крокфорда ( https://github.com/douglascrockford/JSON-js ) но это не имело никакого значения.

4
ответ дан RedYeti 8 July 2014 в 17:49
поделиться

Обратный вызов ошибки должен получить ссылку на объект XHR, проверить код состояния, чтобы узнать, является ли это ошибкой сервера или нет?

0
ответ дан great_llama 8 July 2014 в 17:49
поделиться
  • 1
    Разъяснить alexmngn' s комментарий, .position () только работает, если родитель является положением, относительным, абсолютным, или зафиксированным. Niet Темный Absol' s отвечают на doesn' t имеют это ограничение. – Dwayne 7 May 2016 в 03:23
  • 2
    Разъяснить alexmngn' s комментарий, .position () только работает, если родитель является положением, относительным, абсолютным, или зафиксированным. Niet Темный Absol' s отвечают на doesn' t имеют это ограничение. – Dwayne 7 May 2016 в 03:23
  • 3
    Разъяснить alexmngn' s комментарий, .position () только работает, если родитель является положением, относительным, абсолютным, или зафиксированным. Niet Темный Absol' s отвечают на doesn' t имеют это ограничение. – Dwayne 7 May 2016 в 03:23
  • 4
    Разъяснить alexmngn' s комментарий, .position () только работает, если родитель является положением, относительным, абсолютным, или зафиксированным. Niet Темный Absol' s отвечают на doesn' t имеют это ограничение. – Dwayne 7 May 2016 в 03:23
  • 5
    Разъяснить alexmngn' s комментарий, .position () только работает, если родитель является положением, относительным, абсолютным, или зафиксированным. Niet Темный Absol' s отвечают на doesn' t имеют это ограничение. – Dwayne 7 May 2016 в 03:23

Если вы используете функции jQuery, такие как $.get, $.post, $.ajax ... тогда вы можете использовать параметр text_status, чтобы проверить, какой тип ошибки:

request = $.get('test.html', function(data){
    //whatever
}).fail(function(xhr, text_status, error_thrown) {

    if(text_status!== 'abort'){
        console.warn("Error!!");
    }
});

Из документов jQuery :

jqXHR.fail (функция (jqXHR, textStatus, errorThrown) {}); Альтернативная конструкция для ошибки Опция обратного вызова, метод .fail () заменяет устаревший метод .error (). Обратитесь к deferred.fail () за подробностями реализации.

0
ответ дан Alvaro 8 July 2014 в 17:49
поделиться

С этим трудно справиться правильно во всех ситуациях. К сожалению, во многих популярных браузерах xhr.status является тем же (0), если вызов AJAX отменен навигацией или сервером, который не работает / не отвечает. Так что эта техника редко работает.

Вот набор очень «практичных» хаков, которые я накопил, которые работают довольно хорошо в большинстве случаев, но все еще не пуленепробиваемы. Идея состоит в том, чтобы попытаться перехватить события навигации и установить флаг, который проверяется в обработчике ошибок AJAX. Как это:

var global_is_navigating = false;

$(window).on('beforeunload',function() {
    // Note: this event doesn't fire in mobile safari
    global_is_navigating = true;
});

$("a").on('click',function() {
    // Giant hack that can be helpful with mobile safari
    if( $(this).attr('href') ) {
        global_is_navigating = true;
    }
});

$(document).ajaxError(function(evt, xhr, settings) {
    // default AJAX error handler for page
    if( global_is_navigating ) {
        // AJAX call cancelled by navigation. Not a real error
        return;
    }
    // process actual AJAX error here.
});
12
ответ дан Leopd 8 July 2014 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: