2011-01-26 15 views
68

Quiero tener un método de gestión de errores global para las llamadas ajax, esto es lo que tengo ahora:error jQuery Ajax manejo de ignorar abortado

$.ajaxSetup({ 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
    displayError(); 
    } 
}); 

tengo que ignorar el error de aborted. errorThrown es nulo y textStatus es error. ¿Cómo verifico el aborted?

+3

Para mí textStatus es "abortar". Veo que esta es una vieja pregunta, tal vez ha cambiado. – jackocnr

+0

Para mí, sigue siendo "error". –

Respuesta

46

que tenían que tratar con el mismo caso de uso en la actualidad. La aplicación en la que estoy trabajando tiene estas llamadas ajax de larga duración que pueden ser interrumpidas por 1) el usuario navegando fuera o 2) algún tipo de falla temporal de conexión/servidor. Quiero que el controlador de errores se ejecute solo para fallas de conexión/servidor y no para que el usuario navegue.

La primera vez que intenté la respuesta de Alastair Pitts, pero no funcionó porque ambas solicitudes canceladas y la falla de conexión configuraron el código de estado y readyState en 0. A continuación, intenté 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 funcionó para mí es establecer un detector 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; 
    } 
}); 
+3

Esto no funciona si una solicitud de Ajax es interrumpida por JavaScript –

+1

Esta no es una respuesta válida. En beforeunload la descarga puede ser cancelada. Si eso sucede, se ignorarán todos los siguientes errores de Ajax. – LOST

+0

@LOST El manejador 'beforeunload' está definido por el usuario. ¿Por qué debería establecer globalVars.unloaded en 'true' si va a cancelar la descarga en el mismo método? – bluecollarcoder

21

Algo que encontré es que cuando hay una solicitud cancelada, el status y/o readyState es igual a 0.

En mi controlador de errores global, que tienen un cheque 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 
}); 

que he encontrado que esto funciona perfectamente para mí. Espero que esto ayude, o cualquier otra persona que se encuentra con este :)

+1

Obtengo el mismo estado y readyState si ajax no se pudo conectar con el servidor para comenzar. Pero este es el error que quiero manejar. Solo abortado no. – Mitar

2
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { 

    if (!jqXHR.getAllResponseHeaders()) { 
     return; 
    }   
}); 
+1

No ayuda tampoco. Tanto para las solicitudes canceladas como para los errores de conexión del servidor, los encabezados de respuesta están vacíos. –

+0

@ClovisSix Sí, la solución anterior comprueba si el encabezado de respuesta está vacío y suprime mensajes de error irritantes. Funciona bien en el sistema comercial múltiple que ejecutamos. ¿Puedes dar más detalles sobre lo que intentas lograr/tu problema es? – sieppl

+0

Estamos mostrando mensajes si alguno de nuestros pedidos no puede conectarse al servidor. No los mostramos en el aborto manual, pero el mayor problema fue cuando el usuario navegaba hacia la página siguiente, lo que producía errores de conexión y no había forma de diferenciar entre una solicitud cancelada y un error de conexión. Resolví el problema estableciendo una ventana de var.onforeforeload. Que más o menos detecta un aborto manual. –

10

Usted querrá mirar el argumento textStatus pasado en su función de error. De acuerdo con http://api.jquery.com/jQuery.ajax/, puede tomar los valores "success", "notmodified", "error", "timeout", "abort" o "parsererror". "abortar" es, obviamente, lo que quiere comprobar.

notas más tiempo aquí: jquery-gotcha-error-callback-triggered-on-xhr-abort

+0

Creo que hemos jugado con esto y no logró detectar el tipo de mensaje de error de aborto que tuvimos. – sieppl

2

Sobre la base de Alastair Pitts'a answer, también se puede hacer esto para que los 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); 
     } 
    } 
}); 
0

tuve el mismo problema aquí, y lo que hice como solución era establecer un "abortar" var justo antes de la llamada de abortar(), de la siguiente manera:

aborting = true; 
myAjax.abort(); 

y sólo mostrar el error en el controlador de errores de la solicitud de ajax, en caso de aborto no es cierto.

$.ajax({ 
    [..] 
    error: function() { 
     if (!aborting) { 
      // do some stuff.. 
     } 
     aborting = false; 
    } 
}); 
3

Debido bluecollarcoders respuesta no funciona para peticiones Ajax abortados 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; 
    } 
    ... 
} 

por ejemplo,

handler = jQuery.get("foo") 
handler.abort() 

va a ser saltado en handler ajaxError

32

En jQuery moderna sólo puede comprobar si request.statusText es igual a 'abort':

error: function (request, textStatus, errorThrown) { 
    if (request.statusText =='abort') { 
     return; 
    } 
} 
+0

obtener el "error" de texto – evtuhovdo

+2

en chrome, puedo verificar "abortar". en Firefox, obtengo un "error". La solución de @bluecollarcoder parece ser la mejor para nosotros. – foxontherock

0
var ProductSearchTouchAjax = null; 
function GetItemsTouchAjax(SearchString) { 

    if (ProductSearchTouchAjax != null) { 
     ProductSearchTouchAjax.abort(); 
    } 
    ProductSearchTouchAjax = $.ajax("../Sale/ProductSearchTouchAjax?SearchString=" + SearchString) 
        .done(function (data) { 

        }) 
        .fail(function (request, textStatus, errorThrown) { 
         debugger; 
         if (textStatus == "abort") { 
          return; 
         } else { 
          alert("error-GetProductInfo"); 
         } 
        }); 
} 
Cuestiones relacionadas