JQuery AJAX игнорирует 500 ошибок состояния - PullRequest
13 голосов
/ 24 марта 2011

Я делаю несколько запросов GET к приложению App Engine, тестирую в Chrome.Хотя в консоли javascript я вижу, что некоторые вызовы приводят к ошибке сервера 500, я, похоже, никак не могу зафиксировать эту ошибку в своем коде jQuery, несмотря на чтение ряда подобных потоков SO.Я понимаю, что это указывает на ошибку на стороне сервера, но я все же хотел бы иметь возможность зафиксировать такую ​​ошибку из моего JavaScript.

Мне нужно зафиксировать ошибку, чтобы я мог подсчитать количество ответов (успешным или нет) и вызовет другую функцию, когда все ответы на вызов будут получены.

Выход консоли Chrome:

GET http://myapp.com/api?callback=jQuery12345&params=restOfParams 500 (Internal Server Error)

Мой вызов:

  function makeCall() {
    var count = 0;
    var alldata = $('#inputset').val();
    var rows = alldata.split('\n');
    var countmatch = rows.length;
    for (i=0;i<rows.length;i++) {
      data["param"] = rows[i]["val"];
      $.ajax({
              url: apiUrl,
              type: 'GET',
              data: data,
              dataType: 'jsonp',
              error: function(){
                  alert('Error loading document');
                  count +=1;
              },
              success: function(responseJson) {
                            count +=1;
                            var res = responseJson.results;
                            if (count == countmatch) {
                              allDoneCallback(res);
                            }
                        },
             });
    }
}

Я имеюпопробовал некоторые из следующих действий:
Добавление:

statusCode: {500: function() {alert('err');}}

к вызову.

Использование:

  $().ready(function(){
     $.ajaxSetup({
       error:function(x,e) {
             if(x.status==500) {
               alert('Internel Server Error.');
             }
           }
      });
   });

У кого-нибудь будет предложение относительно того, как я могпоймать ответ 500?

Спасибо Оли

ОБНОВЛЕНИЕ:

Исходя из ответов, мой код jquery кажется правильным, но по какой-то причине онбудет ловить только определенные 500 ответов, полученных от моего приложения.Возможно, это проблема того, как App Engine возвращает ошибку (я не знаю много об этом), или как jquery обрабатывает ошибки с помощью jsonp - этот момент кратко обсуждается в последнем абзаце статьи этой .

Я заставил это работать с помощью jquery-isonp , который перехватил все 500 статусов, выданных приложением.

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

Не похоже, что вы правильно используете привязку document.ready в jQuery.Версия $().ready(...) более или менее устарела.Попробуйте вместо этого один из них:

$(document).ready(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});

или стенография :

$(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});
1 голос
/ 29 сентября 2014

У меня была похожая проблема, я использовал функции обещания jquery .done, .fail, .always, и если я столкнулся с внутренней ошибкой сервера 500, то он не запустил бы ни одну из функций (выполнено, ошибка всегдаошибка).очень странно.

В конце я добавил тайм-аут в параметры .ajax, когда он достигает тайм-аута, он выдает ошибку, а также запускает метод .fail.

searchify.myAjaxSearchTerms = $.ajax({
                        'url': url,
                        type: "GET",
                        'dataType': 'jsonp',
                        'jsonp': 'json.wrf',
                        'jsonpCallback': searchify.cbFunc,
                        timeout: 4000, //needed for 500 errors - will go to fail block on timeout
                        beforeSend: searchify.beforeSendAutocomplete

                    });
searchify.myAjaxSearchTerms.fail(function(XHR, status, error){
                        searchify.clearForm();
                        searchify.renderWarningForNoQuery('<div class="notify-bubble"><span class="icon" data-icon="8" aria-hidden="true"></span><span>Sorry. We had a problem performing that search...<br/>Please try again<br/>Enter a <strong>product name</strong>, <strong>catalogue number</strong> or <strong>keyword</strong></span></div>');
                    });
1 голос
/ 25 августа 2014

Решил проблему, обновив jQuery с 1.9.1 до 2.1.1 - теперь он начал вызывать .error() прямо в ответе сервера (до того, как он проигнорирует ответ 500 и подождет, пока истечет время ожидания).

Ограничение: jQuery 2.1.1 не поддерживает IE8 и ниже (как вам не должен ИМО)

...