2012-02-22 6 views
11

Hago muchas llamadas $ .ajax, y manejo los errores de ellas de una manera que arroja un mensaje. Encuentro que si hay una llamada ajax en curso mientras la página se vuelve a cargar, p. haga clic en Actualizar, o navegue a otra URL, luego mis llamadas ajax en progreso disparan sus devoluciones de llamada de error.Detectando que una llamada jQuery.ajax falló porque la página se está recargando?

¿Cómo puedo saber la diferencia entre un error real y una llamada abortada porque la página se recargó?

$.ajax(...) 
.success(...) 
.error(function(jqXHR) { 
    // jqXHR.status == 0 means either failed to contact server, 
    // or aborted due to page reload -- how can I tell the difference? 
}); 
+0

¿Has mirado lo que está disponible en el objeto jqXHR? –

+0

Adrian: He leído los documentos. ¿Te estabas refiriendo a algo en particular? – kdt

Respuesta

12

agregar un controlador de unload, que establece un indicador en true. Luego, dentro del controlador error, puede marcar esta bandera y hacer algo apropiado.

Ejemplo:

var unloading = false; 
$.ajax(...) ... 
.error(function(jqXHR) { 
    if (unloading) return; // Ignore errors caused by navigating away 
    // Now, check for real errors .. 
}); 
$(window).unload(function() {unloading = true;}); 
+3

este enfoque funcionó para mí, pero tuve que poner el cuerpo del manejador de errores dentro de un 'setTimeout (function(), 250)' porque el manejador de errores se estaba disparando antes de la función window.unload() – scootklein

1
var unloading = false; 
$.ajax(...) ... 
.error(function(jqXHR) { 
    if (unloading) return; // Ignore errors caused by navigating away 
    // Now, check for real errors .. 
}); 
$(window).unload(function() {unloading = true;}); 

La técnica anterior no funciona para una página periódicamente refrescante (por ejemplo cada media segundos). He descubierto que el error causado por la actualización de la página se puede evitar mediante el retraso del proceso de manejo de errores por un período de tiempo reducido.

Ejemplo:

$.ajax(...) 
.success(...) 
.error(function(jqXHR) { 
setTimeout(function() { 
    // error showing process 
}, 1000); 
}); 

Además de eso

window.onbeforeunload = function() {// llamadas parada ajax}

evento se puede utilizar para menos frecuencia refrescantes llamadas ajax.

2

La mejor manera sin tiempos de espera y otros indicadores mágicos es comprobar encabezados xhr. Si no hay encabezados, entonces la respuesta no vino del servidor, entonces la solicitud fue cancelada.

var isUserAbortedRequest = function (xhr) { 
    return !xhr.getAllResponseHeaders(); 
} 

ajaxRequest 
    .fail(function (xhr, error, statusText) { 
     console.log("request aborted = ", isUserAbortedRequest(xhr)); 
    }) 
    .success(...) 

Puede envolver su solicitud de AJAX con $. Se deletreó a continuación y utiliza el objeto proporcionado hecho/no.

$.Deferred(function (def) {   
    ajaxRequest 
     .fail(function (xhr, error, statusText) { 
      console.log("request aborted = ", isUserAbortedRequest(xhr)); 

      def.reject({ aborted: isUserAbortedRequest(xhr), error: error }); 
     }) 
     .success(function (response) { 
      if (response.success == true) { 
       def.resolve(response.data); 
      } 
      else { 
       def.reject({ aborted: false, error: response.error }); 
      } 
     }); 
}); 
+0

Esto parece preferible en comparación con Otras respuestas. Preguntas y respuestas relevantes relacionadas: http://stackoverflow.com/questions/9229005/how-to-handle-jquery-ajax-post-error-when-navigating-away-from-a-page – Luke

Cuestiones relacionadas