2011-03-30 25 views
42

Parece muy inconveniente que el $.getJSON de jQuery silenciosamente falla cuando los datos devueltos no son JSON válidos. ¿Por qué se implementó esto con una falla silenciosa? ¿Cuál es la forma más fácil de realizar getJSON con un mejor comportamiento de falla (por ejemplo, lanzar una excepción, console.log(), o lo que sea)?

+7

Si bien se proporcionaron las respuestas adecuadas para mi problema, todavía estoy desconcertado de que los desarrolladores programaran la falla silenciosa en '$ .getJSON' ... wtf jQuery chicos? –

Respuesta

80

puede utilizar

 function name() { 
      $.getJSON("", function(d) { 
       alert("success"); 
      }).done(function(d) { 
       alert("done"); 
      }).fail(function(d) { 
       alert("error"); 
      }).always(function(d) { 
       alert("complete"); 
      }); 
     } 

Si quiere ver la causa de la e rror, utilizar la versión completa

function name() { 
    $.getJSON("", function(d) { 
     alert("success"); 
    }).fail(function(d, textStatus, error) { 
     console.error("getJSON failed, status: " + textStatus + ", error: "+error) 
    }); 
} 

Si no está bien formado su JSON, verá algo así como

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/' 

Si la dirección es incorrecta, verá algo así como

getJSON failed, status: error, error: Not Found 

Si está tratando de obtener JSON desde otro dominio, violando el Same-origin policy, este enfoque devuelve un mensaje vacío. Tenga en cuenta que puede evitar la política de Mismo origen utilizando JSONP (que tiene el limitations) o el método preferido de Intercambio de recursos de origen cruzado (CORS).

+3

Esta debería ser la respuesta aceptada actualmente –

+3

Tenga en cuenta que .error está en desuso - lo mejor es use .fail en su lugar: http://api.jquery.com/jQuery.ajax/ – micapam

+0

¿Por qué usará esto? en lugar de ajax? mientras que esto es una envoltura para el método ajax ¿no? Entonces, básicamente, sería mejor usar Ajax cuando quieras manejar todo este "estado" ... ¿qué piensas? – ncubica

0

Debería echar un vistazo a los documentos para esta API ... tiene un .error en ella.

http://api.jquery.com/jQuery.getJSON/

+0

+1 Esa sería en realidad una gran solución si no estuviera atascado con jQuery 1.4 ... –

+0

Los métodos de devolución de llamada .success(), .error() y .complete() introducidos en jQuery 1.5 están en desuso a partir de jQuery 1.8. –

3

Puede utilizar $.ajax lugar, y establecer las opciones para dataType "json". De la documentación:

"json": Evalúa la respuesta como JSON y devuelve un objeto JavaScript. En jQuery 1.4, los datos JSON se analizan en de una manera estricta; cualquier JSON malformado es rechazado y se produce un error de análisis. (para más información sobre el formato correcto JSON Ver json.org.)

+0

+1 Aparentemente '$ .ajax' también capta el error de análisis y envía información al error de retorno de llamada, como lo menciona Håvard. –

28

Directamente de la documentación:

Importante: A partir de jQuery 1.4, si el archivo JSON contiene un error de sintaxis , la solicitud generalmente fallará silenciosamente.

Como dice la página de documentación, getJSON es simplemente un método abreviado para

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

Para llegar comportamiento de falla, puede utilizar $ .ajax así:

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

+1 la abreviatura '$ .getJSON' era conveniente, pero no lo suficientemente flexible como para ser realmente útil. /suspiro. –

+1

La documentación es clara, pero esto no explica por qué silenciosamente falla. ¿Cuál es el razonamiento detrás de la capa responsable de analizar una Cadena en un Objeto de JavaScript al guardar silencio sobre los errores de forma predeterminada? – semperos

+3

La abreviatura es útil con la nueva sintaxis de promesa '$ .getJSON (...). Error (function() {...})' –

0

Si está solicitando JSONP como respuesta, obtendrá un error silencioso si no hay respuesta (por ejemplo, interrupción de la red). Vea this thread para más detalles.

Cuestiones relacionadas