2011-02-07 28 views
6

Estoy usando jQuery.getJSON() en una URL (dominio diferente) que puede no existir. ¿Hay alguna manera de detectar el error "Falló la carga de recursos"? Parece que try/catch no funciona debido a la naturaleza asincrónica de esta llamada. No puedo usar jQuery.ajax() 'error:' tampoco. De la documentación:Captura de un error JSONP en una solicitud entre dominios

Nota: Este controlador no se llama para secuencias de comandos entre dominios y solicitudes JSONP.

+0

Confirmación: El error probablemente no es arrojado * * per se, sino que simplemente aparece en la consola (sólo cuando se abre la consola). –

+2

Lo estoy viendo cuando la consola de Chrome está abierta, o es equivalente en otros navegadores.Con las herramientas de desarrollador cerradas, este error es silencioso. Se está perfilando que a) no hay forma de bloquear esto yb) ¿No debería preocuparme por eso? –

Respuesta

-2

objetos diferidos (nuevo en jQuery 1.5) sonar como exactamente lo que está buscando:

jQuery.Deferred, introducida en la versión 1.5, es un objeto de utilidad de conexión en cadena que puede registrar varias devoluciones de llamada en las colas de devolución de llamada, invocan colas de devolución de llamada y retransmiten el estado de éxito o falla de cualquier función síncrona o asíncrona.

http://api.jquery.com/category/deferred-object/

EDIT:

El siguiente código funciona bien para mí:

function jsonError(){ 
    $("#test").text("error"); 
} 

$.getJSON("json.php",function(data){ 
    $("#test").text(data.a); 
}).fail(jsonError); 

json.php se ve así:

print '{"a":"1"}'; 

La función de error se dispara para mí si la ruta a json.php es incorrecta o si el JSON está mal formado. Por ejemplo:

print '{xxx"a":"1"}'; 
+2

No del todo. Defferreds es un mecanismo genérico para sincronizar el resultado de las operaciones asincrónicas. El problema de los OP es detectar si falla una solicitud de JSONP. –

+0

Esto parecía prometedor. No estoy familiarizado con esto y podría estar haciendo esto mal, pero esto no parece funcionar: $ .getJSON ("http://www.bogus.com/&callback=?") .fail (function() {}); –

+0

Actualicé mi respuesta con algún código. –

11

Si usted tiene una idea de la demora del peor caso de un resultado exitoso de regresar del servicio remoto, puede utilizar un mecanismo de tiempo de espera para determinar si hubo un error o no.

var cbSuccess = false; 
$.ajax({ 
    url: 'http://example.com/.../service.php?callback=?', 
    type: 'get', 
    dataType: 'json', 
    success: function(data) { 
       cbSuccess = true; 
      } 
}); 
setTimeout(function(){ 
     if(!cbSuccess) { alert("failed"); } 
    }, 2000); // assuming 2sec is the max wait time for results 
+0

Gracias por su respuesta. Esto arrojará aún el error "Error al cargar el recurso", que es lo que intento detener. –

+2

+1 Un tiempo de espera es el único camino a seguir (a partir de principios de 2011). –

+4

@Matthew Simoneau: Ese error se * registra *, no * arrojó *. No puede evitar que ese error se registre en la consola. –

-6

Lo que su quejándose de un error del lado del cliente que dice que ha intentado descargar un recurso del servidor.

Esto es construido en el navegador y le permite a su navegador decirle al cliente o a los desarrolladores que la descarga de un recurso de internet falló. Esto no tiene nada que ver con JavaScript y es un error de nivel más bajo arrojado en el HTTP capturado por el navegador.

Si quiere tener alguna esperanza de atraparlo, necesitará dejar librerías de ajax de terceros y tratar el objeto XMLHTTPRequest en un nivel mucho más bajo, incluso entonces dudo que pueda hacer algo al respecto.

Básicamente, cuando vea este error, descubra qué objeto está tratando de obtener que no existe o que no se pudo acceder. Luego, deja de acceder o haz que sea accesible.

+5

Los primeros dos párrafos son geniales. El tercero es completamente incorrecto. JSONP es un animal diferente. Pero con cosas regulares de .ajax, puede usar el objeto diferido para manejar errores mucho más elegantemente que jugar directamente con XMLHTTPRequest. –

+0

@rpflo meh XMLHttpRequest es más elegante que '.ajax' y diferido. Sin embargo, muéstreme un ejemplo donde puede detectar este "error" usando jQuery. – Raynos

1

Esto funciona:

j.ajaxSetup({ 
    "error":function(xhr, ajaxOptions, thrownError) { 

    console.log(thrownError);       
}}); 
+1

¿Estás seguro? Las llamadas entre dominios/JSONP no usan XHR, usan inyección de scripts. (Al menos en este caso donde CORS no se considera). – hippietrail

Cuestiones relacionadas