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

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

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

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

Кто-то дает Лучано эти точки 🙂 Я только что проверил его ответ – у меня был подобный вопрос – и отлично работал …

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

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

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

С 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 ().

Я сделал это и вот обновленный fragment кода 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!'); }); 

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

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

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

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

Если это возможно, это похоже на самое простое решение. Вот пример кода Python, который я использовал. (Использование Flask, jsonify fask и 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 } }); 

Почему нет

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

возможно.

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

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

НАПРИМЕР:

 function obterJson(callback) { jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) { setTimeout(function(){ callback(data); },0); } 
  • Как использовать тип: «POST» в jsonp ajax call
  • Может ли кто-нибудь объяснить, что такое JSONP, в условиях неспециалиста?
  • JSONP с веб-интерфейсом ASP.NET
  • jQuery getJSON работает локально, но не перекрестный домен
  • Не правовой JSONP API - Как получить данные без параметра CALLBACK
  • Основной пример использования .ajax () с JSONP?
  • Давайте будем гением компьютера.