Обработка ошибок в вызовах getJSON

192

Как вы можете обрабатывать ошибки в вызове getJSON? Я пытаюсь сослаться на службу междоменных сценариев, используя jsonp, как вы регистрируете метод ошибки?

Аджай
источник
Ajay, почему бы не подумать о правильном ответе?
Ионика Бизэу,
@ IonicăBizeve Отметил это сейчас. Я просто потерял след на некоторое время. Верхний ответ не говорит о JSONP. Как указывает Бен Шелок, я не верю, что поддерживается какой-либо обработчик ошибок.
Ajay

Ответы:

277

$.getJSON() это своего рода абстракция обычного вызова AJAX, где вы должны сказать, что хотите получить ответ в кодировке JSON.

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

Вы можете обрабатывать ошибки двумя способами: в общем (путем настройки вызовов AJAX перед их фактическим вызовом) или конкретно (с помощью цепочки методов).

«универсальный» будет что-то вроде:

$.ajaxSetup({
      "error":function() { alert("error");  }
});

И «конкретный» способ:

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
Лучано Коста
источник
NOPS! Вы можете идти туда, как вам нравится. Посмотрите документы для получения более подробной помощи: http://api.jquery.com/jQuery.ajax
Лучано Коста,
5
Обратите внимание, что для этого требуется jQuery 1.5+ (пытался заставить его работать с jQuery 1.3 и задавался вопросом, почему он жаловался на неверный метод :-)
kenyee
24
ОП спрашивает конкретно о кросс-сайте, JSONPкажется, getJSONв таком случае не вызывает error()функцию. У меня та же проблема. Я думаю, это связано с тем, как JSONPобрабатывается совершенно иначе, чем обычные AJAXвызовы, jQueryнесмотря на getJSONобработку обоих. JSONсделано с XMLHTTPRequestобъектом, но JSONPсделано, динамически добавляя <script>тег к странице HEAD.
hippietrail
3
В документе jQuery Doc говорится: «Примечание. Этот обработчик не вызывается для междоменных сценариев и запросов JSONP». api.jquery.com/jQuery.ajax > ошибка
OneWorld
10
«Методы обратного вызова jqXHR.success (), jqXHR.error () и jqXHR.complete (), представленные в jQuery 1.5, устарели с jQuery 1.8. Чтобы подготовить код для их возможного удаления, используйте jqXHR.done (), jqXHR Вместо этого .fail () и jqXHR.always (). "
Скорунка Франтишек
86

Кто-то дал Лучано эти баллы :) Я только что проверил его ответ - имел похожий вопрос - и работал отлично ...

Я даже добавляю свои 50 центов:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })
frenetix
источник
3
Это было с кросс-сайтом JSONP или с тем же сайтом JSON?
hippietrail
28
Хороший ответ! Просто примечание о .error: В jQuery 1.8 он будет устаревшим, так что используйте .fail
Анатолий Миронов
73

Вот мое дополнение.

Из http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html и официального источника

« Методы обратного вызова jqXHR.success (), jqXHR.error () и jqXHR.complete (), представленные в jQuery 1.5, устарели с jQuery 1.8. Чтобы подготовить код для их возможного удаления, используйте jqXHR.done (), jqXHR Вместо этого .fail () и jqXHR.always (). "

Я сделал это, и вот обновленный фрагмент кода Лучано:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

И с описанием ошибки плюс отображение всех данных json в виде строки:

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

Если вам не нравятся оповещения, замените их console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });
user2314737
источник
Каков хронологический порядок выполнения, неудачи, всегда и кода внутри getJSON?
TheLogicGuy
примечание: console.log не реализован в старых браузерах, как IE7! На всякий случай, если вы используете это!
MadMad666
12

Я знаю, что прошло много времени с тех пор, как кто-то ответил здесь, и автор, вероятно, уже получил свой ответ либо отсюда, либо откуда-то еще. Однако я думаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и тайм-ауты при выполнении запросов getJSON. Поэтому ниже мой ответ на вопрос

Структура getJSON выглядит следующим образом (находится на http://api.jqueri.com ):

$(selector).getJSON(url,data,success(data,status,xhr))

большинство людей реализуют это с помощью

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

где они используют URL-адрес var для предоставления ссылки на данные JSON, отправку данных в качестве места для добавления "?callback=?"и другие переменные, которые должны быть отправлены для получения верных данных JSON, и функцию успеха в качестве функции для обработки данных ,

Однако вы можете добавить переменные status и xhr в вашу функцию успеха. Переменная состояния содержит одну из следующих строк: «success», «notmodified», «error», «timeout» или «parsererror», а переменная xhr содержит возвращенный объект XMLHttpRequest ( находится в w3schools )

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

Таким образом, легко отслеживать тайм-ауты и ошибки без необходимости реализовывать специальный трекер тайм-аута, который запускается после выполнения запроса.

Надеюсь, что это помогает кому-то еще ищет ответ на этот вопрос.

Том Грунтьес
источник
2
Это не работает Обратный вызов «success», как следует из его названия, вызывается только в случае успеха. (Так что я не уверен, для чего предназначен параметр «status» ...)
jwelsh
4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

Это исправлено в jQuery 2.x; В jQuery 1.x вы никогда не получите сообщение об ошибке

Павло О.
источник
1

Я столкнулся с этой же проблемой, но вместо того, чтобы создавать обратные вызовы для неудачного запроса, я просто возвратил ошибку с объектом данных json.

По возможности это кажется самым простым решением. Вот пример кода Python, который я использовал. (Используя Flask, jsonify f и SQLAlchemy от Flask)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

Затем вы можете проверить Javascript, как это;

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});
Ник Вудхэмс
источник
Это хорошо для ошибок, возникающих на сервере, но не фиксируется, когда вызов не может достичь сервера или возникает ошибка до того, как он достигнет кода сервера, например, если пользователь MVC больше не проходит проверку подлинности.
Ли Оадес
1

Почему нет

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

??

Подробнее об используемом .fail()методе (jQuery 1.5+) см. Http://api.jquery.com/jQuery.ajax/#jqXHR.

Поскольку jqXHRфункция возвращается функцией,

$.when(getJSON(...)).then(function() { ... });

возможно.

phil294
источник
0

В некоторых случаях вы можете столкнуться с проблемой синхронизации с этим методом. Я написал обратный вызов внутри setTimeoutфункции, и он работал синхронно, просто отлично =)

НАПРИМЕР:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}
Алекс Алонсо
источник
0

Это довольно старая ветка, но она появляется в поиске Google, поэтому я подумал, что добавлю ответ jQuery 3, используя обещания. Этот фрагмент также показывает:

  • Вам больше не нужно переключаться на $ .ajax для передачи вашего токена на предъявителя
  • Использует .then (), чтобы убедиться, что вы можете синхронно обрабатывать любой результат (я сталкивался с этой проблемой .always () срабатывание обратного вызова слишком рано - хотя я не уверен, что это на 100% верно)
  • Я использую .always (), чтобы просто показать результат, положительный или отрицательный
  • В функции .always () я обновляю две цели с помощью кода статуса HTTP и тела сообщения.

Фрагмент кода:

    $.getJSON({
         url: "https://myurl.com/api",
         headers: { "Authorization": "Bearer " + user.access_token}
    }).then().always(   function (data, textStatus) {
        $("#txtAPIStatus").html(data.status);
        $("#txtAPIValue").html(data.responseText);
    });
Из Орбонии
источник