Con jQuery, ¿cómo puedo cancelar / cancelar una solicitud de Ajax de la que aún no he recibido la respuesta?
javascript
jquery
ajax
lukewm
fuente
fuente
$.ajaxStop
?ajaxStop
solo detecta cuando se completan todas las solicitudes AJAX, no detiene una solicitud. En mi experiencia, se usaría así:$(document).ajaxStop(function(){alert("All done")})
. Usar.abort()
es la mejor opción.Respuestas:
La mayoría de los métodos jQuery Ajax devuelven un objeto XMLHttpRequest (o el equivalente), por lo que puede usarlo
abort()
.Ver la documentación:
ACTUALIZACIÓN: A partir de jQuery 1.5, el objeto devuelto es un contenedor para el objeto XMLHttpRequest nativo llamado jqXHR. Este objeto parece exponer todas las propiedades y métodos nativos, por lo que el ejemplo anterior aún funciona. Ver el objeto jqXHR (documentación de la API jQuery).
ACTUALIZACIÓN 2: a partir de jQuery 3, el método ajax ahora devuelve una promesa con métodos adicionales (como abortar), por lo que el código anterior aún funciona, aunque el objeto que se devuelve ya no es un
xhr
. Vea el blog 3.0 aquí .ACTUALIZACIÓN 3 :
xhr.abort()
todavía funciona en jQuery 3.x. No asuma que la actualización 2 es correcta. Más información sobre el repositorio jQuery Github .fuente
abort
no cierra una conexión establecida con el servidor, porsuccess
lo que aún se llamará. Esto es muy problemático para implementaciones de Comet con encuestas largas..abort()
todavía funciona para mí en jQuery 3.2.1. Este comentario en un problema relacionado de Github por un miembro del equipo central de jQuery parece implicar que esta respuesta es incorrecta y que.abort()
no se eliminó.No puede recuperar la solicitud, pero puede establecer un valor de tiempo de espera después del cual se ignorará la respuesta. Ver esta página para ver las opciones de jquery AJAX. Creo que se llamará a su devolución de llamada de error si se excede el período de tiempo de espera. Ya hay un tiempo de espera predeterminado en cada solicitud de AJAX.
También puede utilizar el aborto () método en el objeto solicitud, pero, mientras que hará que el cliente deje de detectar el evento, se
puedeprobablemente no va a detener el servidor de procesarlo.fuente
Es un asíncrono solicitud , lo que significa que una vez que se envía, está disponible.
En caso de que su servidor esté iniciando una operación muy costosa debido a la solicitud de AJAX, lo mejor que puede hacer es abrir su servidor para escuchar las solicitudes de cancelación y enviar una solicitud de AJAX por separado notificando al servidor que deje de hacer lo que esté haciendo.
De lo contrario, simplemente ignore la respuesta AJAX.
fuente
Guarde las llamadas que realiza en una matriz, luego llame a xhr.abort () en cada una.
GRAN CUEVA: puede cancelar una solicitud, pero eso es solo del lado del cliente. El lado del servidor aún podría estar procesando la solicitud. Si está utilizando algo como PHP o ASP con datos de sesión, los datos de la sesión se bloquean hasta que el ajax haya finalizado. Entonces, para permitir que el usuario continúe navegando por el sitio web, debe llamar a session_write_close (). Esto guarda la sesión y la desbloquea para que continúen otras páginas que esperan continuar. Sin esto, varias páginas pueden estar esperando que se elimine el bloqueo.
fuente
Las solicitudes AJAX pueden no completarse en el orden en que se iniciaron. En lugar de abortar, puede optar por ignorar todas las respuestas AJAX, excepto la más reciente:
Esquema aproximado del código:
Demostración en jsFiddle
fuente
Simplemente tuvimos que solucionar este problema y probamos tres enfoques diferentes.
En nuestro caso, decidimos usar el enfoque n. ° 3, ya que produce menos carga para el servidor. Pero no estoy 100% seguro si jQuery garantiza la llamada del método .complete (), esto podría producir una situación de punto muerto. En nuestras pruebas no pudimos reproducir tal situación.
fuente
Siempre es una buena práctica hacer algo como esto.
Pero es mucho mejor si marca una instrucción if para verificar si la solicitud ajax es nula o no.
fuente
Solo llama a xhr. abort () ya sea un objeto jquery ajax o un objeto XMLHTTPRequest nativo.
ejemplo:
fuente
Estaba haciendo una solución de búsqueda en vivo y necesitaba cancelar las solicitudes pendientes que pueden haber tardado más que la última / más reciente.
En mi caso usé algo como esto:
fuente
Como han notado muchas personas en el hilo, solo porque la solicitud se cancela en el lado del cliente, el servidor aún procesará la solicitud. Esto crea una carga innecesaria en el servidor porque está haciendo un trabajo que hemos dejado de escuchar en el front-end.
El problema que estaba tratando de resolver (que otros también pueden encontrar) es que cuando el usuario ingresó información en un campo de entrada, quise disparar una solicitud de un tipo de sensación de Google Instant.
Para evitar disparar solicitudes innecesarias y mantener la rapidez del front-end, hice lo siguiente:
Básicamente, esto enviará una solicitud cada 150 ms (una variable que puede personalizar para sus propias necesidades). Si usted está teniendo problemas para entender qué es exactamente lo que está pasando aquí, registrar
xhrCount
yxhrQueue
a la consola justo antes del bloque if.fuente
Simplemente use ajax.abort (), por ejemplo, podría cancelar cualquier solicitud de ajax pendiente antes de enviar otra como esta
fuente
Puede abortar cualquier llamada continua ajax usando esto
fuente
no hay una manera confiable de hacerlo, y ni siquiera lo intentaría, una vez que la solicitud esté en camino; La única forma de reaccionar razonablemente es ignorar la respuesta.
en la mayoría de los casos, puede suceder en situaciones como: un usuario hace clic con demasiada frecuencia en un botón que activa muchos XHR consecutivos, aquí tiene muchas opciones, ya sea bloquear el botón hasta que se devuelva XHR, o incluso no activar un nuevo XHR mientras otro se está ejecutando insinuando que el usuario se recueste o descarte cualquier respuesta XHR pendiente que no sea la reciente.
fuente
El siguiente código muestra el inicio y el aborto de una solicitud de Ajax:
fuente
Tuve el problema de sondear y una vez que se cerró la página, la encuesta continuó, por lo que en mi causa un usuario se perdería una actualización, ya que se configuró un valor mysql durante los siguientes 50 segundos después del cierre de la página, aunque eliminé la solicitud de ajax, me di cuenta de que usar $ _SESSION para establecer una var no se actualizará en la encuesta hasta que finalice y comience una nueva, así que lo que hice fue establecer un valor en mi base de datos como 0 = fuera de página, mientras estoy sondeo, consulto esa fila y devuelvo falso; cuando es 0, ya que las consultas en el sondeo obtendrán valores actuales obviamente ...
Espero que esto haya ayudado
fuente
Si
xhr.abort();
provoca la recarga de la página,Luego puede configurar
onreadystatechange
antes de abortar para evitar:fuente
He compartido una demostración que muestra cómo cancelar una solicitud AJAX, si los datos no se devuelven del servidor dentro de un tiempo de espera predefinido.
HTML:
CÓDIGO JS:
fuente
$.ajax
proporciona unatimeout
opción para que no necesite escribir la suya. Simplemente use..., data: {...}, timeout: waitTime,...
.