Usando jQuery, ¿cómo puedo cancelar/abortar una petición Ajax de la que aún no he recibido respuesta?
La mayoría de los métodos de jQuery Ajax devuelven un objeto XMLHttpRequest (o su equivalente), por lo que puede utilizar simplemente abort()
.
Consulte la documentación:
--> -- Rompe la lista... -->
var xhr = $.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
//kill the request
xhr.abort()
ACTUALIZACIÓN: A partir de jQuery 1.5 el objeto devuelto es una envoltura del objeto nativo XMLHttpRequest llamado jqXHR. Este objeto parece exponer todas las propiedades y métodos nativos, por lo que el ejemplo anterior sigue funcionando. Vea El objeto jqXHR (documentación de la API de jQuery).
ACTUALIZACIÓN 2:
A partir de jQuery 3, el método ajax devuelve ahora una promesa con métodos adicionales (como el de abortar), por lo que el código anterior sigue funcionando, aunque el objeto devuelto ya no es un xhr
. Ver el blog 3.0 aquí.
ACTUALIZACIÓN 3: xhr.abort()
aún funciona en jQuery 3.x. No asuma que la actualización 2 es correcta. Más información en el repositorio Github de jQuery.
No se puede recuperar la solicitud pero se puede establecer un valor de tiempo de espera después del cual la respuesta será ignorada. Vea esta página para las opciones de jquery AJAX. Creo que su callback de error será llamado si el periodo de timeout es excedido. Ya existe un tiempo de espera por defecto en cada petición AJAX.
También puede usar el método abort() en el objeto de la petición pero, aunque hará que el cliente deje de escuchar el evento, puede probablemente no impedirá que el servidor lo procese.
Es una solicitud asincrónica, lo que significa que una vez enviada, está ahí fuera.
En caso de que su servidor esté iniciando una operación muy costosa debido a la petición AJAX, lo mejor que puede hacer es abrir su servidor para que escuche las peticiones de cancelación, y enviar una petición AJAX separada notificando al servidor que deje de hacer lo que sea que esté haciendo.
De lo contrario, simplemente ignore la respuesta AJAX.