jQuery $ .ajax, обработчик ошибок не работает - PullRequest
9 голосов
/ 01 сентября 2010

Здравствуйте, я заметил, что этот простой код не работает так, как он должен работать ...

    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);
        }
    });
}

Тест был запущен на локальном хосте, я имею в виду: я загружаю страницу, закрываю локальный веб-сервер, затем запускаю запрос (с помощью простой кнопки с нажатой клавишей мыши, указывающей на эту функцию). Ошибка никогда не вызывается, я получаю вызов обработчика успеха с textStatus = "success" и data = null. Я даже замечаю, что время ожидания запроса превышает 10 секунд. Это происходит в Firefox (последняя версия), Chrome (последняя версия) и Safari 5. Почему это? Это из-за того, что я работаю на localhost?


Я забыл сказать: запрос не кэшируется. На самом деле, и инструменты Firebug, и Chrome dev показывают запрос на неудачу.


Большое обновление

Это поведение связано с использованием localhost. Фактически, если я загружаю эту страницу с другого компьютера-коллеги и, прежде чем инициировать запрос, отключаю свой компьютер от сети, у меня правильно срабатывает обработчик ошибок с тайм-аутом в качестве состояния. Я думаю, что это ошибка в JQuery. Мне будет сложно проверить ошибки таймаута :(


Ребята из форумов jQuery говорят, что это связано с тем, как сетевой стек прерывает соединение, учитывая, что хост является localhost. Я проверял это только на Windows 7. Если вы хотите протестировать это на других системах и можете поработать с некоторыми внутренними компонентами jQuery, сообщите об этом на форумах jQuery:

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

Ответы [ 3 ]

7 голосов
/ 01 сентября 2010

ОБНОВЛЕНО : Попробуйте заменить тест (data == null) на (XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0).

В W3C Candidate Рекомендация о стандарте XMLHttpRequest описывает, что он должен существовать с так называемой ошибкойфлаг ", который должен использоваться, чтобы указать некоторый тип ошибки или прерывания сети.В случае ошибок такого рода статус в XMLHttpRequest будет 0 вместо 200 («ОК»), 201 («Создан»), 304 («Не изменен») и т. Д.Чтобы точно соответствовать http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute, XMLHttpRequest.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");
            }
        }
    });
});
1 голос
/ 01 сентября 2010

В случае сетевой ошибки будет вызван обратный вызов success, а не error, даже если это не имеет особого смысла.Оформить заказ в этом блоге для подробностей.В общем, то, что вы сделали, проверив data == null, правильно.

0 голосов
/ 01 сентября 2010

Даже если вы выключите локальный сервер, он все равно сможет увидеть файл json. Попробуйте временно удалить файл и посмотрите, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...