Почему $ .getJSON молча терпит неудачу? - PullRequest
43 голосов
/ 31 марта 2011

Кажется очень неудобным, что jQuery $.getJSON молча терпит неудачу, когда возвращаемые данные не являются допустимым JSON. Почему это было реализовано с молчаливым провалом? Какой самый простой способ выполнить getJSON с лучшим поведением при сбое (например, сгенерировать исключение, console.log() или что-то еще)?

Ответы [ 5 ]

84 голосов
/ 27 апреля 2012

вы можете использовать

        function name() {
            $.getJSON("", function(d) {
                alert("success");
            }).done(function(d) {
                alert("done");
            }).fail(function(d) {
                alert("error");
            }).always(function(d) {
                alert("complete");
            });
        }

Если вы хотите увидеть причину ошибки, используйте полную версию

function name() {
    $.getJSON("", function(d) {
        alert("success");
    }).fail( function(d, textStatus, error) {
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    });
}

Если ваш JSON не правильно сформирован, вы увидите что-то вроде

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

Если URL неверный, вы увидите что-то вроде

getJSON failed, status: error, error: Not Found

Если вы пытаетесь получить JSON из другого домена, нарушая политику Same-origin , этот подход возвращает пустое сообщение. Обратите внимание, что вы можете обойти политику Same-origin, используя JSONP (который имеет ограничения ) или предпочтительный метод перекрестного совместного использования ресурсов ( CORS ).

29 голосов
/ 31 марта 2011

Непосредственно из документации:

Важное замечание: Начиная с jQuery 1.4, если файл JSON содержит синтаксическую ошибку, запрос обычно завершается молча.

Как сказано на странице документации, getJSON - это просто сокращенный метод для

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback
});

. Чтобы получить поведение при сбое, вы можете использовать $ .ajax, например:

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
});
3 голосов
/ 31 марта 2011

Вместо этого вы можете использовать $.ajax и установить для параметров dataType значение "json".Из документации:

"json": оценивает ответ как JSON и возвращает объект JavaScript.В jQuery 1.4 данные JSON анализируются строго;любой искаженный JSON отклоняется и выдается ошибка синтаксического анализа .(См. Json.org для получения дополнительной информации о правильном форматировании JSON.)

0 голосов
/ 13 января 2016

Если вы запрашиваете JSONP в качестве ответа, вы получите тихий сбой, если ответа нет (например, отключение сети).Подробнее см. в этой теме .

0 голосов
/ 31 марта 2011

Вы должны взглянуть на документы для этого API ... на нем есть .error.

http://api.jquery.com/jQuery.getJSON/

...