2010-07-22 10 views
6

¿Hay alguna manera fácil de abandonar todas las solicitudes jQuery AJAX pendientes? Mi aplicación es capaz de generar una gran cantidad de solicitudes simultáneas, por lo que la raza se vuelve problemática. He puesto soluciones hackish (es decir, poner una bandera que se comprueba cuando se complete la solicitud), pero sería mucho más agradable obtener una función de detención global de todas las solicitudes pendientes.jQuery abandona todas las solicitudes pendientes de AJAX

Respuesta

11

Asignar cada petición Ajax como un elemento de una matriz:

var requests = []; 

requests.push($.ajax({ 
    type: 'POST', 
    url: '...', 
    success: successfunc 
    }); 
); 

y matar:

$.each(requests, function(i, v) { 
    v.abort(); 
}); 
+0

Gracias. Esto parece haber hecho el truco. Elegí una implementación ligeramente diferente que detallo [aquí] (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

Yo diría almacenar todas las solicitudes de Ajax en una matriz. Cuando necesite matar, simplemente recorra todos los valores de la matriz y llame a abort(). Cuando se completa o cancela una solicitud, solo emerge de la matriz.

2

XMLHttpRequest tiene una función abort(). $ .ajax te permite tener en tus manos el objeto xhr. mantenga un registro de todas las xhr sobresalientes y vaya al xhr.abort() para cualquiera que desee finalizar.

3

como los otros han dicho, utilice el método .abort(). Sin embargo, esto ÚNICAMENTE funciona en llamadas dentro del mismo dominio. una vez que ingresas a las llamadas entre sitios (con jsonp), el método .abort() se delega a nulo, por lo que en realidad no se activa/funciona.

digno de mención, ya que me causó el tiempo de depuración sin fin hace más de una pequeña luna :)

Jim

+0

Información interesante, gracias por ese aviso . – Anders

+0

anders - placer ... (aunque compruebe el estado más reciente en IE, ya que era principalmente el XMLHttpRequest en IE el que había sido un problema cuando intentaba convertirlo en un navegador independiente de mi caso). Me parece recordar que el aborto 'timeout' se establece en 0 en las llamadas al sitio x. de todos modos ... :) –

3

basado en la solución de Ken Redler, puse esto en mi inicialización:

window.requests = [] 
$.ajaxSetup({ 
    beforeSend: function(xhr){ 
    var new_request_list = [xhr] 
    $.each(window.requests, function(k,v){ 
     if(v.readyState != 4) new_request_list.push(v) 
    }) 
    window.requests = new_request_list 
    } 
}) 

I ponga el fragmento con new_request_list solo para evitar que la variable global se llene de objetos XHR completados.

+0

Pondría la función de limpieza en '$ .ajaxSetup' o' xhr.onreadystatechange', pero me preocupa que esto interfiera con lo que jQuery haga por sí mismo. Esta solución parece funcionar bien. –

1

Encontré lo siguiente en jsfiddle. En su mayoría es el mismo que el anterior, excepto que eliminará cada solicitud una vez que se completen. Las soluciones anteriores solo siguen agregando a la matriz. Entonces, con el tiempo, podría ser enorme si estás haciendo muchas llamadas ajax. Llame al $.xhrPool.abortAll(); cuando desee cancelar todas las solicitudes pendientes.

// $.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); 
     } 
    } 
}); 
Cuestiones relacionadas