jquery 3 ajax().fail(jqXHR) статус всегда равен 0

jquery #ajax

#jquery #ajax

Вопрос:

При обслуживании моего (старого) веб-приложения я обнаружил, что обработка ошибок перестала работать, вероятно, уже некоторое время назад. Вот мой старый код, который работал:

 $.ajax({
  url: this.url,
  type: 'post',
  data: jsonsendobject,
  dataType: 'json',
  crossDomain: true, // comment this out when not in test mode from foreign webapp
  xhrFields: { withCredentials: true }, // comment this out when not in thest mode from foreign webapp

  }).done(function(data, textStatus, jqXHR) {

    // do something after it worked

  }).fail(function(jqXHR,textStatus,errorThrown) {

    console.log(JSON.stringify(jqXHR));
    // now always returns: {"readyState":0,"status":0,"statusText":"error"}             

  });
 

Теперь jqXHR всегда возвращает 0, даже если сервер, очевидно, отправляет код состояния 500.

Я искал множество вопросов здесь, в stackoverflow, но большинство из них были заданы примерно в 2011 году, и качество ответов, к сожалению, плохое. Вот разные мнения, которые я прочитал:

  • jquery начиная с версии 2.0 (версии 3.0) больше не поддерживает объект jqXHR. Он возвращается по соображениям совместимости, но статус всегда равен 0.
  • Объект jqXHR пуст при использовании с HTTP 2.0
  • Коды состояния HTTP не работают, если тип данных «json» (или «jsonp»)
  • Коды состояния HTTP не работают, если это междоменное (или локальное веб-приложение)

Но если я прочитаю документацию (https://api.jquery.com/jquery.ajax ) Я не могу найти доказательств того, что один из этих ответов правильный,

Я понимаю, что я, вероятно, мог бы сделать что-то подобное

 $.ajax({
  statusCode: {
    404: function() {
      alert( "page not found" );
    }
  }
});
 

Но я бы предпочел получить код состояния и после этого решить (вместе с другими параметрами), что с этим делать.

Каков рабочий, не устаревший способ получения кода состояния в вызове .fail()?

Комментарии:

1. «Я не могу найти доказательств того, что один из этих ответов правильный» — jQuery с открытым исходным кодом: github.com/jquery/jquery

2. @Andreas Я обновил вопрос для облегчения понимания. Очевидно, я протестировал его, и у меня это не сработало, вот почему я прошу рабочее решение, которое не является устаревшим. Ваш комментарий о просмотре исходного кода бесполезен. Если вам наскучил мой вопрос, то не тратьте впустую свое время.

3. Почему это бесполезно? У вас есть куча возможных ответов, и вы не знаете, какой из них правильный. Окончательный ответ можно найти в источнике , и он доступен для всех.

4. @Andreas Это то же самое, как если бы у вас был вопрос о классическом латинском синтаксисе, и мой ответ был бы: «Прочитайте речи Цицерона, там вы найдете ответ».