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

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

Ответ 1

Кажется, нет метода ошибок из того, что я прочитал здесь. Этот ответ дает хорошее объяснение

Ответ 2

$.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"); });

Ответ 3

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

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

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

Ответ 4

Здесь мое дополнение.

Из 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() вместо этого. "

Я сделал это, и здесь Luciano обновил фрагмент кода:

$.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!'); });

Ответ 5

Я знаю, что прошло некоторое время, так как кто-то ответил здесь, и плакат, вероятно, уже получил ответ отсюда или откуда-то еще. Однако я считаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и таймауты при выполнении запросов 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, datatosend как место для добавления "?callback=?" и других переменных, которые необходимо отправить, чтобы получить правильные данные JSON, и функцию успеха как функция для обработки данных.

Однако вы можете добавить статус и переменные 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");
    }         
});

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

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

Ответ 6

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

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

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

Ответ 7

Почему бы не

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

возможно.

Ответ 8

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

например:

function obterJson(callback) {


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

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

Ответ 9

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