Quiero tener un método de manejo de errores global para llamadas ajax, esto es lo que tengo ahora:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
Necesito ignorar el error de aborted
. errorThrown
es nulo y textStatus
es error
. ¿Cómo verifico aborted
?
jquery
ajax
error-handling
Shawn Mclean
fuente
fuente
abort
de forma manual (y no estoy seguro de que cuando otro él llamará) se puede pasar en el mensaje de error:abort("abort")
.Respuestas:
Tuve que lidiar con el mismo caso de uso hoy. La aplicación en la que estoy trabajando tiene estas llamadas ajax de larga duración que pueden ser interrumpidas por 1) el usuario navega o 2) algún tipo de conexión temporal / falla del servidor. Quiero que el controlador de errores se ejecute solo para la conexión / falla del servidor y no para el usuario que se aleja.
Primero probé la respuesta de Alastair Pitts, pero no funcionó porque tanto las solicitudes abortadas como la falla de conexión establecieron el código de estado y readyState en 0. Luego, probé la respuesta de sieppl; tampoco funcionó porque en ambos casos, no se da respuesta, por lo tanto no hay encabezado.
La única solución que me funcionó es configurar un oyente para window.onbeforeunload, que establece una variable global para indicar que la página se ha descargado. El controlador de errores puede verificar y solo llamar al controlador de errores solo si la página no se ha descargado.
var globalVars = {unloaded:false}; $(window).bind('beforeunload', function(){ globalVars.unloaded = true; }); ... $.ajax({ error: function(jqXHR,status,error){ if (globalVars.unloaded) return; } });
fuente
beforeunload
controlador lo define el usuario. ¿Por qué establecería globalVars.unloaded entrue
si va a cancelar la descarga con el mismo método?beforeunload
no se llama cuando el usuario navega a otra página o se llama demasiado tarde?En jQuery moderno, puede verificar si
request.statusText
es igual a'abort'
:error: function (request, textStatus, errorThrown) { if (request.statusText =='abort') { return; } }
fuente
Algo que encontré es que cuando hay una solicitud abortada, el
status
y / oreadyState
igual0
.En mi controlador de errores global, tengo una marca en la parte superior del método:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { //If either of these are true, then it's not a true error and we don't care if (jqXHR.status === 0 || jqXHR.readyState === 0) { return; } //Do Stuff Here });
He descubierto que esto funciona perfectamente para mí. Espero que esto te ayude a ti oa cualquier otra persona que se encuentre con esto :)
fuente
Querrá ver el argumento textStatus pasado a su función de error. Según http://api.jquery.com/jQuery.ajax/ , puede tomar los valores "éxito", "no modificado", "error", "tiempo de espera", "abortar" o "error de análisis". "abortar" es obviamente lo que quiere comprobar.
Notas más largas aquí: jquery-gotcha-error-callback-triggered-on-xhr-abort
fuente
Debido a que la respuesta de bluecollarcoders no funciona para solicitudes ajax abortadas por javascript, aquí está mi solución:
var unloaded = false; ... $(window).bind('beforeunload', function(){ unloaded = true; }); $(document).ajaxError(function(event, request, settings) { if (unloaded || request.statusText == "abort") { return; } ... }
p.ej
handler = jQuery.get("foo") handler.abort()
ahora será ignorado por el controlador ajaxError
fuente
Sobre la base de la respuesta de Alastair Pitts , también puede hacer esto para tener mensajes más informativos:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { { if (jqXHR.status === 0) { alert('Not connect.\n Verify Network.'); } else if (jqXHR.status == 404) { alert('Requested page not found. [404]'); } else if (jqXHR.status == 500) { alert('Internal Server Error [500].'); } else if (exception === 'parsererror') { alert('Requested JSON parse failed.'); } else if (exception === 'timeout') { alert('Time out error.'); } else if (exception === 'abort') { alert('Ajax request aborted.'); } else { alert('Uncaught Error.\n' + jqXHR.responseText); } } });
fuente
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { if (!jqXHR.getAllResponseHeaders()) { return; } });
fuente
Tuve el mismo problema aquí, y lo que hice como solución fue establecer una var de "aborto" justo antes de la llamada de abort (), como se muestra a continuación:
aborting = true; myAjax.abort();
y solo muestra el error en el controlador de errores de la solicitud ajax, si abortar no es cierto.
$.ajax({ [..] error: function() { if ( !aborting ) { // do some stuff.. } aborting = false; } });
fuente
Si aborta la solicitud ajax manualmente, puede hacer lo siguiente:
var xhr; function queryData () { if (xhr) { // tag it's been aborted xhr.hasAborted = true; // manually canceled request xhr.abort(); } xhr = $.ajax({ url: '...', error: function () { if (!xhr.hasAborted) { console.log('Internal Server Error!'); } }, complete: function () { xhr = null; } }); }
fuente