¿Desea cancelar las solicitudes de ajax antes de enviar la siguiente? (jQuery)
-
05-07-2019 - |
Pregunta
Tengo un informe en nuestro sistema interno que puede devolver datos desde 1 día hasta años completos. Debido a esto, el informe puede tardar 0,5 segundos o más de 45 segundos en generar todo.
El informe le permite modificar una serie de filtros, todos los cuales, cuando se modifican, activan una solicitud ajax de manera muy simple:
var ax = $.ajax({
type: "GET",
url: "/blah",
data: values,
success: function(data) { .. }
});
Ahora, el problema surge cuando nuestro maravilloso usuario declara " ¡Oh, espera! Quiero que esto sea de febrero, no de enero! & Quot ;. ¡Pero, una solicitud ya está ocurriendo ya que enero es una gran cantidad de datos! Entonces, el usuario cambia la opción de fecha a febrero y puedo ver la consola de Javascript enviando una segunda solicitud. Ahora tenemos dos yendo y es una carrera>
/ report /? start_date = January (Sigue cargando ...)
/ report /? start_date = Febrero (¡Hola, ahora estoy aquí también!)
Entonces, generalmente el más pequeño se cargará antes, pero luego el otro se carga y sobrescribe el que ya tenían ... hmm :)
He intentado usar ax.abort ()
colocado después de la declaración de la variable ax
como se menciona here pero no parece estar funcionando.
Así que ahora me pregunto, ¿qué me estoy perdiendo? Solo quiero eliminar la solicitud actual (del lado del cliente, sé que no puedo hacer nada al respecto en el lado del servidor) tan pronto como el usuario cambia algunas opciones, por lo que no tengo 2 o más solicitudes al mismo tiempo. . Configurar async: false
no es una opción, ya que simplemente bloquea al usuario.
Gracias de antemano por tu ayuda.
Solución
Puede consultar el ajaxmanager plugin
Otros consejos
Creo que intentar abortar la solicitud anterior no es una buena solución. Tal vez debería usar una solución simple: para cada contador de aumento de solicitudes ajax en javascript, y pasarlo a la devolución de llamada ajax. Cuando se produce la devolución de llamada, compruebe si el contador de la respuesta es el mismo que el valor del contador actual. Si no es así, ignore la respuesta: se disparó por un evento de clic desactualizado.