JSONP solicita el manejo de errores

Estoy haciendo una solicitud de ajax jsonp, pero el manejo de error de falla no funcionará. Si la solicitud es 404 o 500, no manejará el error.

He estado buscando una respuesta a esto, pero no puedo encontrar nada. Parece que hay una solución en http://code.google.com/p/jqueryjsonp/ , pero no puedo encontrar ningún ejemplo sobre cómo usarla.

function authenticate(user, pass) { $.ajax ({ type: "POST", url: "url", dataType: 'jsonp', async: false, //json object to sent to the authentication url data: {"u": userid, "p": pass}, success: function (data) { //successful authentication here console.log(data); }, error: function(XHR, textStatus, errorThrown) { alert("error: " + textStatus); alert("error: " + errorThrown); } }) } 

Dos formas de manejar el error

  1. No hay un manejo de errores para solicitudes JSONP entre dominios. Utilice el complemento jsonp disponible en Github https://github.com/jaubourg/jquery-jsonp que proporciona soporte para el manejo de errores.

  2. jQuery ajax Timeout – Tiempo de espera después de un período de tiempo razonable para disparar la callback de error porque podría haber fallado silenciosamente. Es posible que no sepa cuál fue el error real (o el estado del error), pero al menos puede manejar el error

Si comprueba la documentación de jQuery.ajax () , puede encontrar:

error

Una función que debe invocarse si la solicitud falla (…) Nota : Este controlador no se llama para secuencias de comandos entre dominios y solicitudes JSONP entre dominios. Este es un Evento Ajax.

Por eso, estás obligado a encontrar una solución alternativa. Puede especificar el tiempo de espera para activar una callback de error. Significa que dentro del marco de tiempo especificado, la solicitud debe completarse con éxito. De lo contrario, suponga que ha fallado:

 $.ajax({ ... timeout: 5000, // a lot of time for the request to be successfully completed ... error: function(x, t, m) { if(t==="timeout") { // something went wrong (handle it) } } }); 

Otros problemas en tu código …

Mientras que JSONP (mira aquí y aquí ) se puede utilizar para superar la restricción de la política de origen, no se puede POST usar JSONP (ver CORS en su lugar) porque simplemente no funciona de esa manera : crea un elemento para recuperar datos, que tiene que hacerse a través de la solicitud GET. La solución JSONP no utiliza el objeto XmlHttpRequest, por lo que no es una solicitud AJAX en la forma estándar de entendimiento, pero el contenido todavía se accede dinámicamente, sin diferencia para el usuario final.

 $.ajax({ url: url, type: "GET" dataType: "jsonp", ... 

En segundo lugar, proporciona datos incorrectamente. Está presionando el objeto javascript (creado con literales de objeto) en el cable en lugar de su representación JSON serializada. Crear cadena JSON (no manualmente, use, por ejemplo, el convertidor JSON.stringify ):

 $.ajax({ ... data: JSON.stringify({u: userid, p: pass}), ... 

Último problema, has configurado async en false , mientras que la documentación dice:

Solicitudes entre dominios y tipo de datos: las solicitudes “jsonp” no son compatibles con la operación síncrona.

He estado luchando como usted por un tiempo tratando de manejar los errores en las solicitudes de tipos de datos ajax jsonp; sin embargo, quiero compartir mi código, espero que ayude. Una cosa básica es incluir un tiempo de espera en la solicitud de AJAX; de lo contrario, nunca ingresará el error: función

 $.ajax({ url: "google.com/api/doesnotexists", dataType: "jsonp", timeout: 5000, success: function (parsed_json) { console.log(parsed_json); }, error: function (parsedjson, textStatus, errorThrown) { console.log("parsedJson: " + JSON.stringify(parsedjson)); $('body').append( "parsedJson status: " + parsedjson.status + '' + "errorStatus: " + textStatus + '' + "errorThrown: " + errorThrown); } }); 

jsfiddle – Manejar errores con jquery ajax call y JSONP dataType – Error 404

Estoy construyendo un proyecto JS frágil que usa jquery-jsonp, y se me ocurrió un enfoque dual-jsonp / ajax que maneja errores sin importar qué método termine siendo utilizado.

 function authenticate(user, pass) { var ajax = ($.jsonp || $.ajax)({ 'url': /* your auth url */, 'data': { /* user, pass, ... */ }, 'contentType': "application/javascript", 'dataType': 'jsonp', 'callbackParameter': 'callback' // $.jsonp only; $.ajax uses 'jsonpCallback' }); ajax.done(function (data) { // your success events }); ajax.fail(function (jqXHR, textStatus, errorThrown) { // $.jsonp calls this func as function (jqXHR, textStatus) // and $.ajax calls this func with the given signature console.error('AJAX / JSONP ' + textStatus + ': ' + (errorThrown || jqXHR.url)); }); } 

Dado que tanto jquery-jsonp como $ .ajax admiten la especificación jQuery Deferred, podemos unir los dos manejadores de errores, manejando los errores de las series 400 y 500, así como los tiempos de espera de búsqueda.

Una vieja pregunta, pero tuve el mismo problema. Aquí hay una solución que funcionó para mí.

Si posee el dominio donde realiza su solicitud, puede establecer una variable en la respuesta y verificarla en el lado del cliente.

Lado del servidor:

 SERVER_RESPONSE=true; Callback(parameter1, parameter2); 

Lado del cliente:

 if(typeof SERVER_RESPONSE === 'undefined'){ console.log('No Response, maybe server is down'); } else{ console.log('Got a server response'); }