Jquery ajax игнорирует ошибку состояния 500
Я делаю некоторые запросы GET в приложение App Engine, тестирование в Chrome. Хотя я вижу в javascript-консоли, что некоторые вызовы приводят к ошибке на 500 серверов, я, похоже, не могу найти эту ошибку в коде jQuery, несмотря на то, что читал несколько подобных потоков SO. Я понимаю, что это указывает на ошибку на стороне сервера, но я все равно хотел бы уловить такую ошибку из моего javascript.
Мне нужно зафиксировать ошибку, чтобы я мог подсчитать количество ответов (успешно или иначе) и вызвать другую функцию, когда все ответы на вызовы были получены.
Выход консоли Chrome:
GET http://myapp.com/api?callback=jQuery12345¶ms=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?
Спасибо
Oli
UPDATE:
На основе ответов мой код jquery кажется правильным, но по какой-то причине он поймал только 500 ответов, полученных от моего приложения. Возможно, это проблема с тем, как App Engine возвращает ошибку (я не знаю об этом много) или как jquery обрабатывает ошибки с помощью jsonp - этот момент кратко обсуждается в последнем абзаце этой статьи.
Я получил это для работы с помощью jquery-isonp, который поймал весь статус 500, брошенный приложением.
Ответы
Ответ 1
Не похоже, что вы правильно используете привязку jQuery document.ready
. Версия $().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.');
}
}
});
});
Ответ 2
Устранила проблему, обновив jQuery с 1.9.1 до 2.1.1 - теперь он начал называть .error()
прямо на ответ сервера (прежде чем он проигнорировал ответ 500 и дождитесь окончания тайм-аута).
Ограничение: jQuery 2.1.1 не поддерживает IE8 и ниже (как IMO не должен)
Ответ 3
У меня была аналогичная проблема, я использовал функции jQuery для обещаний .done,.fail и всегда, и если бы я столкнулся с ошибкой внутреннего сервера 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>');
});