в jQuery $.ajax, обработчик ошибок не работает
Привет я заметил, что этот простой код не работает, как это должно работать...
function test() {
$.ajax( {
'url' : 'test/GameConfiguration.json',
'dataType' : 'json',
data : {
a : 'aaa'
},
cache : false,
method : 'get',
timeout : 10000, //10 secs of timeout
success : function(data, textStatus, XMLHttpRequest) {
console.log("success");
if (data == null)
console.log("it's not a real success");
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log("error: " + textStatus);
}
});
}
тест был запущен на localhost, я имею в виду: я загружаю страницу, Я закрываю локальный веб-сервер, затем я запускаю запрос (с помощью простой кнопки с onclick, указывающей на эту функцию). Ошибка никогда не вызывается, я получаю, чтобы вызвать обработчик успеха, и он имеет textStatus = "успех" и data = null. Я даже замечаю, что запрос истекает задолго до 10 считанные секунды. Это происходит в Firefox (последняя версия), Chrome (последняя версия) и Safari 5. Почему это? Это из-за того, что я работаю на localhost?
Я забыл сказать: запрос не кэшируется. На самом деле как firebug, так и Chrome dev tools показывают запрос на сбой.
большое обновление
Это поведение связано с использованием localhost. На самом деле, если я загружаю эту страницу с другого компьютера collegue и перед запуском запроса я отключите мой компьютер от сети, я правильно получаю обработчик ошибок с таймаутом в качестве статуса. Я думаю, что это ошибка jQuery. Это затруднит проверку ошибок тайм-аута: (
ребята из форумов jQuery говорят, что это связано с тем, как сетевой стек прерывает соединение, учитывая, что хост является localhost. Я тестировал это только на Windows 7. Если вы хотите протестировать это на других системах, и вы можете разработать некоторые внутренние компоненты jQuery, сообщите об этом в jQuery форумы:
3 ответов
обновлено: попробуйте заменить тест (data == null)
до (XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0)
.
в рекомендации кандидата W3C о XMLHttpRequest
стандарт описывается, что он должен существовать так называемый "флаг ошибки", который должен использоваться для указания некоторого типа сетевой ошибки или аборта. В случае такого рода ошибок статус в XMLHttpRequest
будет 0 вместо 200 ("ОК"), 201 ("создано"), 304 ("не изменено") и так далее. В точности соответствует http://www.w3.org/TR/XMLHttpRequest/#the-status-attributeXMLHttpRequest.status
может быть 0 в случае XMLHttpRequest.readyState
равно 0 или 1 ("не отправлено "или"открыто"). Другой случай -XMLHttpRequest.readyState
равно 4 ("готово") и" флаг ошибки " - true. Если у нас нет из этих двух случаев XMLHttpRequest.status
должен быть код состояния HTTP. Под http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html или http://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes нет кода состояния HTTP равна 0. Поэтому мне кажется, что вы можете сделать следующее
jQuery(document).ready(function () {
$.ajax({
type: 'GET',
url: 'test/GameConfiguration.json',
dataType: 'json',
cache : false,
success: function(data, textStatus, xhr){
if (xhr.readyState === 4 && xhr.status === 0) {
// if readyState is DONE (numeric value 4) then corresponds to
// http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done
// "The DONE state has an associated error flag that indicates
// some type of network error or abortion."
// Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute
// If error flag it true, xhr.status is 0.
alert('"error flag\" is true. It means that we have a network error"+
" or abortion (for example because of Same Origin Policy restrictions)');
}
else {
alert(textStatus);
alert(data);
}
},
error: function(xhr, textStatus, errorThrown) {
if (textStatus !== null) {
alert("error: " + textStatus);
} else if (errorThrown !== null) {
alert("exception: " + errorThrown.message);
}
else {
alert ("error");
}
}
});
});
Если есть сетевая ошибка success
обратный вызов будет вызван, а не error
даже если это не имеет смысла. Оформить заказ этот блог для сведения. Итак, в основном, что вы сделали, проверив data == null
является правильным.
даже если вы выключите локальный сервер, он все равно должен видеть файл json.. попробуйте временно удалить файл и посмотреть, работает ли это.