success example error jquery ajax

example - jquery ajax json



Detener todas las solicitudes de ajax activas en jQuery (14)

Tengo un problema, al enviar un formulario, todas las solicitudes activas de ajax fallan y eso desencadena un evento de error.

¿Cómo detener todas las solicitudes de ajax activas en jQuery sin un evento de error desencadenante?


A continuación, le indicamos cómo conectar esto a cualquier clic (útil si su página está realizando muchas llamadas AJAX y está intentando alejarse).

$ -> $.xhrPool = []; $(document).ajaxSend (e, jqXHR, options) -> $.xhrPool.push(jqXHR) $(document).ajaxComplete (e, jqXHR, options) -> $.xhrPool = $.grep($.xhrPool, (x) -> return x != jqXHR); $(document).delegate ''a'', ''click'', -> while (request = $.xhrPool.pop()) request.abort()


Cada vez que creas una solicitud ajax puedes usar una variable para almacenarla:

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

Entonces puede abortar la solicitud:

request.abort();

Puede usar una matriz para realizar un seguimiento de todas las solicitudes de ajax pendientes y cancelarlas si es necesario.


El siguiente fragmento de código le permite mantener una lista ( grupo ) de solicitudes y abortarlas todas si es necesario. Es mejor colocarlo en el <HEAD> de su html, antes de realizar cualquier otra llamada AJAX.

<script type="text/javascript"> $(function() { $.xhrPool = []; $.xhrPool.abortAll = function() { $(this).each(function(i, jqXHR) { // cycle through list of recorded connection jqXHR.abort(); // aborts connection $.xhrPool.splice(i, 1); // removes from list by index }); } $.ajaxSetup({ beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); }, // annd connection to list complete: function(jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index } }); }) </script>


El uso de ajaxSetup , como se indica en su página de documentos. Solo configura los valores predeterminados y, si algunas solicitudes los anulan, habrá un desastre.

Llego tarde a la fiesta, pero solo para futuras referencias si alguien está buscando una solución al mismo problema, este es mi objetivo, inspirado y en gran parte idéntico a las respuestas anteriores, pero más completo

// Automatically cancel unfinished ajax requests // when the user navigates elsewhere. (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}); }); var abort = function() { $.each(xhrPool, function(idx, jqXHR) { jqXHR.abort(); }); }; var oldbeforeunload = window.onbeforeunload; window.onbeforeunload = function() { var r = oldbeforeunload ? oldbeforeunload() : undefined; if (r == undefined) { // only cancel requests if there is no prompt to stay on the page // if there is a prompt, it will likely give the requests enough time to finish abort(); } return r; } })(jQuery);


Esto es lo que estoy usando actualmente para lograr eso.

$.xhrPool = []; $.xhrPool.abortAll = function() { _.each(this, function(jqXHR) { jqXHR.abort(); }); }; $.ajaxSetup({ beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); } });

Nota: _.each of underscore.js está presente, pero obviamente no es necesario. Solo soy perezoso y no quiero cambiarlo a $ .each (). 8P


Extendí mkmurray y SpYk3HH responde arriba para que xhrPool.abortAll pueda abortar todas las solicitudes pendientes de una url dada :

$.xhrPool = []; $.xhrPool.abortAll = function(url) { $(this).each(function(i, jqXHR) { // cycle through list of recorded connection console.log(''xhrPool.abortAll '' + jqXHR.requestURL); if (!url || url === jqXHR.requestURL) { jqXHR.abort(); // aborts connection $.xhrPool.splice(i, 1); // removes from list by index } }); }; $.ajaxSetup({ beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); // add connection to list }, complete: function(jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index } }); $.ajaxPrefilter(function(options, originalOptions, jqXHR) { console.log(''ajaxPrefilter '' + options.url); jqXHR.requestURL = options.url; });

El uso es el mismo, excepto que abortAll ahora puede opcionalmente aceptar una URL como parámetro y cancelará solo las llamadas pendientes a esa URL.


Haz un pool de todas las solicitudes de ajax y abórtalas .....

var xhrQueue = []; $(document).ajaxSend(function(event,jqxhr,settings){ xhrQueue.push(jqxhr); //alert(settings.url); }); $(document).ajaxComplete(function(event,jqxhr,settings){ var i; if((i=$.inArray(jqxhr,xhrQueue)) > -1){ xhrQueue.splice(i,1); //alert("C:"+settings.url); } }); ajaxAbort = function (){ //alert("abortStart"); var i=0; while(xhrQueue.length){ xhrQueue[i++] .abort(); //alert(i+":"+xhrQueue[i++]); } };


He actualizado el código para que funcione para mí.

$.xhrPool = []; $.xhrPool.abortAll = function() { $(this).each(function(idx, jqXHR) { jqXHR.abort(); }); $(this).each(function(idx, jqXHR) { var index = $.inArray(jqXHR, $.xhrPool); if (index > -1) { $.xhrPool.splice(index, 1); } }); }; $.ajaxSetup({ beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); }, complete: function(jqXHR) { var index = $.inArray(jqXHR, $.xhrPool); if (index > -1) { $.xhrPool.splice(index, 1); } } });


Igual de importante: diga que quiere cerrar sesión y está generando nuevas solicitudes con temporizadores: porque los datos de la sesión se renuevan con cada nueva rutina de arranque (tal vez pueda decir que estoy hablando de Drupal, pero este podría ser cualquier sitio que use sesiones). Tuve que revisar todos mis scripts con una búsqueda y reemplazo, porque tenía un montón de cosas ejecutándose en diferentes casos: variables globales en la parte superior:

var ajReq = []; var canAj = true; function abort_all(){ for(x in ajReq){ ajReq[x].abort(); ajReq.splice(x, 1) } canAj = false; } function rmvReq(ranNum){ var temp = []; var i = 0; for(x in ajReq){ if(x == ranNum){ ajReq[x].abort(); ajReq.splice(x, 1); } i++; } } function randReqIndx(){ if(!canAj){ return 0; } return Math.random()*1000; } function getReqIndx(){ var ranNum; if(ajReq.length){ while(!ranNum){ ranNum = randReqIndx(); for(x in ajReq){ if(x===ranNum){ ranNum = null; } } } return ranMum; } return randReqIndx(); } $(document).ready(function(){ $("a").each(function(){ if($(this).attr(''href'').indexOf(''/logout'')!=-1){ $(this).click(function(){ abort_all(); }); } }) }); // Then in all of my scripts I wrapped my ajax calls... If anyone has a suggestion for a // global way to do this, please post var reqIndx = getReqIndx(); if(reqIndx!=0){ ajReq[reqIndx] = $.post(ajax, { ''action'': ''update_quantities'', iids:iidstr, qtys:qtystr }, function(data){ //..do stuff rmvReq(reqIndx); },''json''); }


Lanzar mi sombrero. Ofrece métodos de abort y remove contra de la matriz xhrPool , y no es propenso a problemas con los reemplazos de ajaxSetup .

/** * Ajax Request Pool * * @author Oliver Nassar <[email protected]> * @see http://.com/questions/1802936/stop-all-active-ajax-requests-in-jquery */ jQuery.xhrPool = []; /** * jQuery.xhrPool.abortAll * * Retrieves all the outbound requests from the array (since the array is going * to be modified as requests are aborted), and then loops over each of them to * perform the abortion. Doing so will trigger the ajaxComplete event against * the document, which will remove the request from the pool-array. * * @access public * @return void */ jQuery.xhrPool.abortAll = function() { var requests = []; for (var index in this) { if (isFinite(index) === true) { requests.push(this[index]); } } for (index in requests) { requests[index].abort(); } }; /** * jQuery.xhrPool.remove * * Loops over the requests, removes it once (and if) found, and then breaks out * of the loop (since nothing else to do). * * @access public * @param Object jqXHR * @return void */ jQuery.xhrPool.remove = function(jqXHR) { for (var index in this) { if (this[index] === jqXHR) { jQuery.xhrPool.splice(index, 1); break; } } }; /** * Below events are attached to the document rather than defined the ajaxSetup * to prevent possibly being overridden elsewhere (presumably by accident). */ $(document).ajaxSend(function(event, jqXHR, options) { jQuery.xhrPool.push(jqXHR); }); $(document).ajaxComplete(function(event, jqXHR, options) { jQuery.xhrPool.remove(jqXHR); });


Lo encontré muy fácil para múltiples solicitudes.

paso 1: define una variable en la parte superior de la página:

xhrPool = []; // no need to use **var**

step2: set beforeSend en todas las solicitudes de ajax:

$.ajax({ ... beforeSend: function (jqXHR, settings) { xhrPool.push(jqXHR); }, ...

paso 3: utilízalo donde quieras:

$.each(xhrPool, function(idx, jqXHR) { jqXHR.abort(); });


Mejor usar código independiente .....

var xhrQueue = []; $(document).ajaxSend(function(event,jqxhr,settings){ xhrQueue.push(jqxhr); //alert(settings.url); }); $(document).ajaxComplete(function(event,jqxhr,settings){ var i; if((i=$.inArray(jqxhr,xhrQueue)) > -1){ xhrQueue.splice(i,1); //alert("C:"+settings.url); } }); ajaxAbort = function (){ //alert("abortStart"); var i=0; while(xhrQueue.length){ xhrQueue[i++] .abort(); //alert(i+":"+xhrQueue[i++]); } };


Proporcione a cada solicitud xhr un ID único y almacene la referencia del objeto en un objeto antes de enviarlo. Eliminar la referencia después de completar una solicitud xhr.

Para cancelar toda solicitud en cualquier momento:

$.ajaxQ.abortAll();

Devuelve los ID únicos de solicitud cancelada. Sólo para fines de prueba.

Función de trabajo:

$.ajaxQ = (function(){ var id = 0, Q = {}; $(document).ajaxSend(function(e, jqx){ jqx._id = ++id; Q[jqx._id] = jqx; }); $(document).ajaxComplete(function(e, jqx){ delete Q[jqx._id]; }); return { abortAll: function(){ var r = []; $.each(Q, function(i, jqx){ r.push(jqx._id); jqx.abort(); }); return r; } }; })();

Devuelve un objeto con una sola función que se puede usar para agregar más funcionalidad cuando sea necesario.


Tuve algunos problemas con el código de Andy, pero me dio algunas grandes ideas. El primer problema fue que deberíamos arrancar cualquier objeto jqXHR que se complete con éxito. También tuve que modificar la función abortAll. Aquí está mi código de trabajo final:

$.xhrPool = []; $.xhrPool.abortAll = function() { $(this).each(function(idx, jqXHR) { jqXHR.abort(); }); }; $.ajaxSetup({ beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); } }); $(document).ajaxComplete(function() { $.xhrPool.pop(); });

No me gustó la forma ajaxComplete () de hacer las cosas. No importa cómo intenté configurar .ajaxSetup, no funcionó.