Tengo una solicitud AJAX que se realizará cada 5 segundos. Pero el problema es antes de la solicitud AJAX, si la solicitud anterior no se completa, tengo que cancelar esa solicitud y hacer una nueva solicitud.
Mi código es algo como esto, ¿cómo resolver este problema?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Respuestas:
El método jquery ajax devuelve un objeto XMLHttpRequest . Puede usar este objeto para cancelar la solicitud.
El XMLHttpRequest tiene un aborto método, que cancela la solicitud, pero si el pedido ya ha sido enviado al servidor a continuación, el servidor procesará la solicitud , incluso si abortar la solicitud, pero el cliente no esperará a / manejar la respuesta.
El objeto xhr también contiene readyState que contiene el estado de la solicitud (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 y DONE-4). podemos usar esto para verificar si se completó la solicitud anterior.
fuente
readystate
arriba yreadyState
abajo, el personajes
se escribe con mayúscula en jQuery 1.5if (xhr) xhr.abort();
funcionará bien también.readystate
en su documentación. Siempre estaba en mayúsculareadyState
y jquery (antes o después de 1.5) coincide correctamente con la especificación w3.Cuando realice una solicitud a un servidor, haga que verifique si un progreso no es nulo (o si obtiene esos datos) primero. Si está obteniendo datos, cancele la solicitud anterior e inicie la nueva.
fuente
Sé que esto podría ser un poco tarde, pero tengo problemas similares en los que llamar al método de aborto realmente no canceló la solicitud. en cambio, el navegador todavía estaba esperando una respuesta que nunca usa. Este código resolvió ese problema.
fuente
¿Por qué deberías abortar la solicitud?
Si cada solicitud lleva más de cinco segundos, ¿qué sucederá?
No debe cancelar la solicitud si el parámetro que pasa con la solicitud no está cambiando. por ejemplo: - la solicitud es para recuperar los datos de notificación. En tales situaciones, el buen enfoque es establecer una nueva solicitud solo después de completar la solicitud anterior de Ajax.
fuente
Puede usar jquery-validate.js. El siguiente es el fragmento de código de jquery-validate.js.
De modo que solo necesita establecer el modo de parámetro para abortar cuando realiza una solicitud ajax.
Ref: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
fuente
jQuery: use esto como punto de partida, como inspiración. Lo resolví así: (esta no es una solución perfecta, simplemente aborta la última instancia y es código WIP)
fuente
Crea una función para llamar a tu API. Dentro de esta función definimos solicitud
callApiRequest = $.get(...
, aunque esta es una definición de una variable, la solicitud se llama de inmediato, pero ahora tenemos la solicitud definida como una variable. Antes de llamar a la solicitud, verificamos si nuestra variable está definidatypeof(callApiRequest) != 'undefined'
y también si está pendientesuggestCategoryRequest.state() == 'pending'
; si ambas son verdaderas, hacemos.abort()
la solicitud, lo que evitará que se ejecute la devolución de llamada exitosa.Es posible que su servidor / API no admita la cancelación de la solicitud (¿qué sucede si la API ya ejecutó algún código?), Pero la devolución de llamada de JavaScript no se activará. Esto es útil cuando, por ejemplo, está proporcionando sugerencias de entrada a un usuario, como la entrada de hashtags.
Puede ampliar aún más esta función agregando la definición de devolución de llamada de error, lo que debería suceder si se cancela la solicitud.
El caso de uso común para este fragmento sería una entrada de texto que se activa en
keypress
caso de evento. Puede usar un tiempo de espera para evitar el envío de (algunas de) solicitudes que deberá cancelar.abort()
.fuente
También debe verificar readyState 0. Porque cuando usa xhr.abort () esta función establece readyState en 0 en este objeto, y su comprobación if siempre será verdadera - readyState! = 4
fuente