2010-08-11 16 views
16

¿Hay alguna forma de cancelar todas las solicitudes de Ajax globalmente sin un control en el objeto de solicitud?Anular todas las solicitudes de jQuery AJAX globalmente

La razón por la que pregunto es que tenemos una aplicación bastante compleja en la que estamos ejecutando una serie de solicitudes Ajax diferentes en segundo plano mediante el uso de setTimeOut(). Si el usuario hace clic en un botón determinado, debemos detener todas las solicitudes en curso.

+1

posible duplicado de [Stop todas las peticiones ajax activos en jQuery] (http://stackoverflow.com/questions/1802936/stop-all- active-ajax-requests-in-jquery) – Shoban

+0

@shoban, pero creo que RobertW está preguntando si hay una manera si NO tienes un control para ellos. – 7wp

+0

Esta pregunta puede proporcionarle lo que está buscando http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery – codingbadger

Respuesta

11

es necesario llamar a abort() método:

var request = $.ajax({ 
    type: 'POST', 
    url: 'someurl', 
    success: function(result){..........} 
}); 

Después de que se puede abortar la solicitud:

request.abort(); 

De esta manera es necesario crear una variable para su solicitud Ajax y luego se puede utilizar el método abort para abortar la solicitud en cualquier momento.

también echar un vistazo a:

+0

Para cancelar varias solicitudes ajax intente: http: // stackoverflow .com/a/42312101/3818394 –

7

No se puede abortar todas las peticiones Ajax activos si no se realiza el seguimiento de las asas para ellos.

Pero si lo está siguiendo, entonces sí puede hacerlo, al pasar por sus manejadores y llamando al .abort() en cada uno.

3

Se puede utilizar esta secuencia de comandos:

// $.xhrPool and $.ajaxSetup are the solution 
$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 

Compruebe el resultado en http://jsfiddle.net/s4pbn/3/.

+8

Copió [aquí] (http://stackoverflow.com/a/8841412/1767377) y lo pegó aquí. Aunque aprecio el jsfiddle ** - 1 porque no dio crédito por el mérito del crédito. ** Y ahora, para una cita de película: "deshonrarlo, deshonrar a su vaca, deshonrar a su tío ..."-Mulan – SyntaxRules

+0

método abortAll solo se puede usar una vez aquí, porque $ .xhrPool = []; destruirá el método. Si desea poder usarlo varias veces, puede hacer $ .xhrPool.length = 0; en su lugar – igrek

+2

Consulte http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript para obtener más información – igrek

3

Esta respuesta a una pregunta relacionada es lo que funcionó para mí:

https://stackoverflow.com/a/10701856/5114

Nota la primera línea donde el @grr dice: "El uso de ajaxSetup no es correcto"

Puede adaptar su Responda para agregar su propia función a la ventana si desea llamarlo usted mismo en lugar de usar window.onbeforeunload como lo hacen.

// Most of this is copied from @grr verbatim: 
(function($) { 
    var xhrPool = []; 
    $(document).ajaxSend(function(e, jqXHR, options){ 
    xhrPool.push(jqXHR); 
    }); 
    $(document).ajaxComplete(function(e, jqXHR, options) { 
    xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR}); 
    }); 
    // I changed the name of the abort function here: 
    window.abortAllMyAjaxRequests = function() { 
    $.each(xhrPool, function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    }; 
})(jQuery); 

Luego puede llamar al window.abortAllMyAjaxRequests(); para abortarlas todas. Asegúrese de agregar un .fail(jqXHRFailCallback) a sus solicitudes de ajax. La devolución de llamada será 'abortar' como textStatus para que sepa lo que sucedió:

function jqXHRFailCallback(jqXHR, textStatus){ 
    // textStatus === 'abort' 
} 
+0

Usar ajaxSetup no es "incorrecto", pero no sabes que va a ir para causar problemas hasta que lo haga ... y a veces cuando lo hace, es realmente difícil recordar que es ajaxSetup lo que está jugando contigo. :-) +1 a esta respuesta por no usar ajaxSetup. –

Cuestiones relacionadas