¿Cómo cancelar/abortar la solicitud jQuery AJAX?
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 realizar 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);
);
El método jquery ajax devuelve un objeto XMLHttpRequest . Puede utilizar este objeto para cancelar la solicitud.
XMLHttpRequest tiene un método de cancelación , que cancela la solicitud, pero si la solicitud ya se envió al servidor, entonces el servidor procesará la solicitud incluso si abortamos la solicitud, pero el cliente no esperará ni manejará la respuesta.
El objeto xhr también contiene un 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.
$(document).ready(
var xhr;
var fn = function(){
if(xhr && xhr.readyState != 4){
xhr.abort();
}
xhr = $.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Cuando realiza una solicitud a un servidor, haga que primero verifique si el progreso no es nulo (o está recuperando esos datos). Si está recuperando datos, cancele la solicitud anterior e inicie la nueva.
var progress = null
function fn () {
if (progress) {
progress.abort();
}
progress = $.ajax('ajax/progress.ftl', {
success: function(data) {
//do something
progress = null;
}
});
}
Sé que esto puede ser un poco tarde, pero tengo problemas similares en los que llamar al método de cancelación realmente no canceló la solicitud. en cambio, el navegador todavía estaba esperando una respuesta que nunca usa. este código resolvió ese problema.
try {
xhr.onreadystatechange = null;
xhr.abort();
} catch (e) {}
¿Por qué debería cancelar la solicitud?
Si cada solicitud tarda más de cinco segundos, ¿qué pasará?
No debe cancelar la solicitud si el parámetro que se pasa con la solicitud no cambia. por ejemplo: - la solicitud es para recuperar los datos de notificación. En tales situaciones, el mejor enfoque es establecer una nueva solicitud solo después de completar la solicitud Ajax anterior.
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
},
complete: function(){setTimeout(fn, 500);}
});
};
var interval = setTimeout(fn, 500);
);