¿Cómo cancelar/abortar la solicitud jQuery AJAX?

Resuelto user556673 asked hace 13 años • 8 respuestas

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);
);
user556673 avatar Dec 29 '10 10:12 user556673
Aceptado

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);
);
Arun P Johny avatar Dec 29 '2010 03:12 Arun P Johny

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;
        }
    });
}
Taz avatar Mar 26 '2013 15:03 Taz

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) {}
Lyon avatar Jan 31 '2015 22:01 Lyon

¿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);

);
Mohammed H avatar Jan 31 '2013 05:01 Mohammed H