2010-07-22 5 views
6

Existe-t-il un moyen facile d'abandonner toutes les requêtes jQuery AJAX en attente? Mon application est capable de tirer beaucoup de demandes simultanées, donc la course devient problématique. J'ai mis dans des solutions hackish (à savoir, mettre dans un drapeau qui est vérifié à la fin de la demande), mais il serait beaucoup plus agréable d'obtenir un arrêt global toutes les demandes en suspens fonctionnent.jQuery abandonne toutes les demandes AJAX en attente

Répondre

11

attribuer à chaque demande de paiement ajax comme un élément d'un tableau:

var requests = []; 

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

Et pour tuer:

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

Merci. Cela semble avoir fait l'affaire. J'ai choisi une implémentation légèrement différente que je détaillerai [ici] (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

Je dirais stocker toutes les demandes ajax dans un tableau. Quand vous avez besoin de tuer, faites simplement une boucle sur toutes les valeurs dans array et appelez abort(). Quand une demande est terminée ou annulée, il suffit de faire un saut dans le tableau.

2

XMLHttpRequest possède une fonction abort(). $ .ajax vous permet de mettre la main sur l'objet xhr. Gardez un enregistrement de tous les xhr en cours et allez xhr.abort() pour tout ce que vous voulez terminer.

3

que les autres ont dit, utilisez la méthode .abort(). Cependant, cela fonctionne UNIQUEMENT sur les appels dans le même domaine. Une fois que vous entrez dans les appels inter-sites (avec jsonp), alors la méthode .abort() est déléguée à null, donc ne sera pas réellement en feu/travail.

intéressant de noter que cela m'a fait du temps de débogage sans fin beaucoup il y a une petite lune :)

jim

+0

Cool information, merci pour ce heads up . – Anders

+0

anders - plaisir ... (pour vérifier le dernier état sur IE car c'était principalement le XMLHttpRequest dans IE qui avait été un problème en essayant de rendre le navigateur agnostique dans mon cas). il me semble me souvenir que l'abandon 'timeout' est mis à 0 sur les appels x-site. de toute façon .. :) –

3

Basé sur la solution de Ken Redler, je mets dans mon initialisation:

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 mettre dans l'extrait avec new_request_list juste pour éviter que la variable globale ne soit encombrée d'objets XHR complétés.

+0

Je mettrais la fonction de nettoyage dans '$ .ajaxSetup' ou' xhr.onreadystatechange', mais je crains que cela interfère avec tout ce que jQuery fait par lui-même. Cette solution semble fonctionner correctement. –

1

J'ai trouvé ce qui suit au sujet de jsfiddle. Il est généralement le même que ci-dessus, sauf qu'il va supprimer chaque demande une fois qu'ils sont complets. Les solutions ci-dessus ne cessent de s'ajouter au tableau. Donc au fil du temps, il pourrait devenir énorme si vous faites beaucoup d'appels ajax. Vous appelez $.xhrPool.abortAll(); lorsque vous souhaitez abandonner toutes les demandes en attente.

// $.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); 
     } 
    } 
}); 
Questions connexes