Manejo de errores en llamadas getJSON

¿Cómo se pueden manejar los errores en una llamada getJSON? Estoy intentando hacer referencia a un servicio de script entre dominios usando jsonp, ¿cómo se registra un método de error?

Parece que no hay un método de error según lo que he leído aquí . Esta respuesta ofrece una buena explicación

$.getJSON() es un tipo de abstracción de una llamada regular de AJAX en la que tendrías que decir que quieres una respuesta codificada JSON.

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

Puede manejar los errores de dos maneras: genéricamente (configurando sus llamadas AJAX antes de llamarlas) o específicamente (con la cadena de métodos).

‘genérico’ sería algo así como:

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

Y la forma ‘específica’:

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

Alguien le dio a Luciano estos puntos 🙂 Acabo de probar su respuesta, tuve una pregunta similar, y funcionó perfectamente …

Incluso agrego mis 50 centavos:

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

Aquí está mi adición.

De http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html y la fuente oficial

Los métodos de callback jqXHR.success (), jqXHR.error () y jqXHR.complete () introducidos en jQuery 1.5 están obsoletos a partir de jQuery 1.8. Para preparar su código para su eventual eliminación, use jqXHR.done (), jqXHR .fail () y jqXHR.always () en su lugar.

Lo hice y aquí está el fragmento de código actualizado de 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!'); }); 

Y con la descripción del error más mostrando todos los datos json como una cadena:

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

Si no le gustan las alertas, sustitúyalas por 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!'); }); 

Sé que ha pasado un tiempo desde que alguien respondió aquí y el póster probablemente ya obtuvo su respuesta, ya sea desde aquí o desde otro lugar. Sin embargo, creo que esta publicación ayudará a cualquiera que busque una forma de realizar un seguimiento de los errores y los tiempos de espera mientras realiza las solicitudes getJSON. Por lo tanto, debajo de mi respuesta a la pregunta

La estructura getJSON es la siguiente (se encuentra en http://api.jqueri.com ):

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

la mayoría de las personas implementan eso usando

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

donde usan la url var para proporcionar un enlace a los datos JSON, el datatosend como un lugar para agregar el "?callback=?" y otras variables que deben enviarse para obtener los datos correctos de JSON devueltos, y la función de éxito como una función para procesar los datos.

Sin embargo, puede agregar el estado y las variables xhr en su función de éxito. La variable de estado contiene una de las siguientes cadenas: “success”, “notmodified”, “error”, “timeout” o “parsererror”, y la variable xhr contiene el objeto XMLHttpRequest devuelto ( encontrado en 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"); } }); 

De esta forma, es fácil hacer un seguimiento de los tiempos de espera y los errores sin tener que implementar un rastreador de tiempo de espera personalizado que se inicia una vez que se realiza una solicitud.

Espero que esto ayude a alguien que todavía está buscando una respuesta a esta pregunta.

Me enfrenté con este mismo problema, pero en lugar de crear devoluciones de llamada para una solicitud fallida, simplemente devolví un error con el objeto de datos json.

Si es posible, esta parece ser la solución más fácil. Aquí hay una muestra del código de Python que utilicé. (Usando Flask, Flask’s jsonify f y 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.") 

Entonces puedes verificar Javascript así;

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

Por qué no

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

??

Para obtener detalles sobre el método .fail() usado (jQuery 1.5+), consulte http://api.jquery.com/jQuery.ajax/#jqXHR

Como la jqXHR devuelve jqXHR , un encadenamiento como

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

es posible.

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

En algunos casos, puede encontrarse con un problema de sincronización con este método. Escribí la llamada de callback dentro de una función setTimeout , y funcionó sincrónicamente bien =)

P.EJ:

 function obterJson(callback) { jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) { setTimeout(function(){ callback(data); },0); }