Обработка ошибок в вызовах getJSON - PullRequest
181 голосов
/ 16 ноября 2009

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

Ответы [ 8 ]

272 голосов
/ 05 апреля 2011

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

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

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

'generic' будет выглядеть примерно так:

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

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

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
81 голосов
/ 14 сентября 2011

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

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

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })
62 голосов
/ 29 сентября 2013

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

Из 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!'); });
11 голосов
/ 28 ноября 2013

Я знаю, что прошло много времени с тех пор, как кто-то ответил здесь, и постер, вероятно, уже получил свой ответ либо отсюда, либо откуда-то еще. Однако я думаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и тайм-ауты при выполнении запросов 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 для предоставления ссылки на данные 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 голосов
/ 25 января 2016

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

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

1 голос
/ 14 октября 2015

Почему бы не

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() { ... });

возможно.

1 голос
/ 21 декабря 2012

Я столкнулся с этой же проблемой, но вместо того, чтобы создавать обратные вызовы для неудачного запроса, я просто возвратил ошибку с объектом данных 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
    }
});
0 голосов
/ 07 июля 2015

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

например:

function obterJson(callback) {


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

    setTimeout(function(){
        callback(data);
    },0);
}
...