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 Это то же самое, как если бы у вас был вопрос о классическом латинском синтаксисе, и мой ответ был бы: «Прочитайте речи Цицерона, там вы найдете ответ».