в 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 форумы:

http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error-and-localhost#14737000001331961

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.. попробуйте временно удалить файл и посмотреть, работает ли это.