¿Cómo capturar jQuery $.getJSON (o $.ajax con el tipo de datos establecido para 'jsonp') error cuando se utiliza JSONP?

StackOverflow https://stackoverflow.com/questions/309953

  •  08-07-2019
  •  | 
  •  

Pregunta

Es posible coger un error cuando se utiliza JSONP con jQuery?He intentado tanto el $.getJSON y $.métodos ajax pero tampoco se captura el error 404 estoy probando.Aquí es lo que he intentado (tenga en cuenta que todas funcionan correctamente, pero quiero manejar el caso cuando se produce un error):

jQuery.ajax({
    type: "GET",
    url: handlerURL,
    dataType: "jsonp",
    success: function(results){
        alert("Success!");
    },
    error: function(XMLHttpRequest, textStatus, errorThrown){
        alert("Error");
    }
});

Y también:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    });

También he intentado añadir el $.ajaxError pero que no funciona bien:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

Gracias de antemano por las respuestas!

¿Fue útil?

Solución

Parece que las solicitudes JSONP que no devuelven un resultado exitoso nunca desencadenan ningún evento, éxito o fracaso, y para bien o para mal, eso es aparentemente por diseño.

Después de buscar su rastreador de errores, hay un parche que puede ser Una posible solución utilizando una devolución de llamada de tiempo de espera. Consulte informe de error # 3442 . Si no puede capturar el error, al menos puede agotar el tiempo de espera después de esperar un tiempo razonable para el éxito.

Otros consejos

Aquí es mi respuesta extensa a una pregunta similar.

Aquí está el código:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

Detectando problemas JSONP

Si no desea descargar una dependencia, puede detectar el estado de error usted mismo. Es fácil.

Solo podrá detectar errores JSONP utilizando algún tipo de tiempo de espera. Si no hay una respuesta válida en un momento determinado, suponga un error. Sin embargo, el error podría ser básicamente cualquier cosa.

Aquí hay una manera simple de verificar errores. Simplemente use una bandera success:

var success = false;

$.getJSON(url, function(json) {
    success = true;
    // ... whatever else your callback needs to do ...
});

// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

Como mencionó thedawnrider en los comentarios, también puedes usar clearTimeout en su lugar:

var errorTimeout = setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

$.getJSON(url, function(json) {
    clearTimeout(errorTimeout);
    // ... whatever else your callback needs to do ...
});

¿Por qué? Sigue leyendo ...


Así es como JSONP funciona en pocas palabras:

JSONP no utiliza XMLHttpRequest como las solicitudes regulares de AJAX. En su lugar, inyecta una etiqueta <script> en la página, donde & Quot; src & Quot; El atributo es la URL de la solicitud. El contenido de la respuesta está envuelto en una función Javascript que luego se ejecuta cuando se descarga.

Por ejemplo.

Solicitud JSONP: https://api.site.com/endpoint?this=that&callback=myFunc

Javascript inyectará esta etiqueta de script en el DOM:

<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>

¿Qué sucede cuando se agrega una etiqueta callback al DOM? Obviamente, se ejecuta.

Supongamos que la respuesta a esta consulta arrojó un resultado JSON como:

{"answer":42}

Para el navegador, eso es lo mismo que la fuente de un script, por lo que se ejecuta. Pero qué sucede cuando ejecutas esto:

<script>{"answer":42}</script>

Bueno, nada. Es solo un objeto. No se almacena, guarda y no sucede nada.

Esta es la razón por la cual las solicitudes JSONP envuelven sus resultados en una función. El servidor, que debe admitir la serialización JSONP, ve el parámetro myFunc que especificó y en su lugar lo devuelve:

myFunc({"answer":42})

Entonces esto se ejecuta en su lugar:

<script>myFunc({"answer":42})</script>

... que es mucho más útil. En algún lugar de su código hay, en este caso, una función global llamada <=>:

myFunc(data)
{
    alert("The answer to life, the universe, and everything is: " + data.answer);
}

Eso es todo. Esa es la & Quot; magic & Quot; de JSONP. Luego, construir en un tiempo de espera es muy simple, como se muestra arriba. Haga la solicitud e inmediatamente después, comience un tiempo de espera. Después de X segundos, si su bandera aún no se ha configurado, la solicitud expiró.

Sé que esta pregunta es un poco vieja, pero no vi una respuesta que ofrezca una solución simple al problema, así que pensé que compartiría mi solución 'simple'.

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 

Simplemente podemos usar la devolución de llamada .fail() para verificar si se produjo un error.

Espero que esto ayude :)

Si colabora con el proveedor, puede enviar otro parámetro de cadena de consulta que sea la función de devolución de llamada cuando haya un error.

? callback =? & amp; error =?

Esto se llama JSONPE pero no es en absoluto un estándar de facto.

El proveedor luego pasa información a la función de error para ayudarlo a diagnosticar.

Sin embargo, no ayuda con los errores de comunicación: jQuery tendría que actualizarse para devolver también la función de error en el tiempo de espera, como en la respuesta de Adam Bellaire.

Parece que esto está funcionando ahora:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

Utilizo esto para detectar un error JSON

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}

Editar: también puede obtener el mensaje de error. Esto le permitirá saber cuál es exactamente el error. Intenta seguir la sintaxis en el bloque catch

alert("Error : " + err);

¿Puede esto funcionar?

.complete(function(response, status) {
    if (response.status == "404")
        alert("404 Error");
    else{
        //Do something
    }   
    if(status == "error")
        alert("Error");
    else{
        //Do something
    }
});

No sé cuando el estado va en " error " modo. Pero lo probé con 404 y respondió

puede manejar explícitamente cualquier número de error agregando este atributo en la solicitud ajax:

statusCode: {
        404: function() {
          alert("page not found");
        }
    }

entonces, su código debería ser así:

jQuery.ajax({
type: "GET",
statusCode: {
        404: function() {
          alert("page not found");
        }
},
url: handlerURL,
dataType: "jsonp",
success: function(results){
    alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
    alert("Error");
}
});

espero que esto te ayude :)

También he publicado esta respuesta en piladesbordamiento - Manejo de errores en getJSON llamadas

Sé que ha pasado un tiempo desde que alguien answerd aquí y el cartel probablemente ya tiene su respuesta, ya sea de aquí o de algún otro lugar.Yo sin embargo creo que este post va a ayudar a cualquier persona que busca una manera de mantener un seguimiento de los errores y los tiempos de espera mientras se hace getJSON solicitudes.Por lo tanto, a continuación mi respuesta a la pregunta

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

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

la mayoría de las personas que implementar el uso de

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

donde se utilice la dirección url var para proporcionar un enlace a los datos JSON, el datatosend como un lugar para agregar el "?callback=?" y otras variables que se han de enviar a obtener la correcta datos JSON devuelto, y el éxito de la función como una función para el procesamiento de los datos.

Sin embargo, puede agregar el estado y xhr variables en el éxito de su función.La variable de estado contiene una de las siguientes cadenas :el "éxito", "notmodified", "error", "tiempo de espera", o "parsererror", y el xhr contiene la variable devuelve el objeto XMLHttpRequest (se encuentran 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 manera es fácil seguir la pista de los tiempos de espera y los errores sin tener que implementar un tiempo de espera personalizado tracker que se inicia una vez que una solicitud se hace.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top