2010-08-11 7 views
16

Existe-t-il un moyen d'annuler globalement toutes les requêtes Ajax sans un handle sur l'objet requête?Abandonner globalement toutes les requêtes jQuery AJAX

La raison pour laquelle je demande est que nous avons une application assez complexe où nous exécutons un certain nombre de demandes Ajax différentes en arrière-plan en utilisant setTimeOut(). Si l'utilisateur clique sur un bouton donné, nous devons arrêter toutes les demandes en cours.

+1

double possible de [Arrêter toutes les demandes de ajax actifs dans jQuery] (http://stackoverflow.com/questions/1802936/stop-all- active-ajax-requests-in-jquery) – Shoban

+0

@shoban, mais je pense que RobertW demande s'il y a un moyen de ne pas avoir un handle pour eux. – 7wp

+0

Cette question peut vous fournir ce que vous recherchez http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery – codingbadger

Répondre

11

Vous devez appeler abort() méthode:

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

Après cela, vous pouvez annuler la demande:

request.abort(); 

De cette façon, vous devez créer une variable pour votre demande de paiement ajax et vous pouvez utiliser la méthode abort sur cela pour annuler la demande à tout moment.

ont également un oeil à:

+0

Pour abandonner plusieurs requêtes ajax, essayez: http: // stackoverflow .com/a/42312101/3818394 –

7

Vous ne pouvez pas annuler toutes les demandes actives Ajax si vous n'êtes pas suivi les poignées pour eux.

Mais si vous le traquez, alors oui vous pouvez le faire, en faisant une boucle dans vos gestionnaires et en appelant .abort() sur chacun d'eux.

3

Vous pouvez utiliser ce script:

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

Vérifiez le résultat à http://jsfiddle.net/s4pbn/3/.

+8

Vous avez copié [ici] (http://stackoverflow.com/a/8841412/1767377) et l'avez collé ici. Tandis que j'apprécie le jsfiddle ** - 1 parce que vous n'avez pas donné le crédit où le crédit était dû. ** Et maintenant pour une citation de film: "déshonorez-vous, déshonorez votre vache, déshonorez votre oncle ..."-Mulan – SyntaxRules

+0

La méthode abortAll ne peut être utilisée qu'une seule fois ici, car $ .xhrPool = []; détruira la méthode Si vous voulez pouvoir l'utiliser plusieurs fois, vous pouvez faire $ .xhrPool.length = 0, au lieu de – igrek

+2

Reportez-vous à http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript pour plus de détails. – igrek

3

Cette réponse à une question connexe est ce qui a fonctionné pour moi:

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

Notez la première ligne où l'@grr dit: "Utilisation ajaxSetup n'est pas correct"

Vous pouvez adapter son répondez pour ajouter votre propre fonction à la fenêtre si vous voulez l'appeler vous-même plutôt que d'utiliser window.onbeforeunload comme ils le font. Vous pouvez ensuite appeler le window.abortAllMyAjaxRequests(); pour les abandonner tous. Assurez-vous d'ajouter un .fail(jqXHRFailCallback) à vos demandes ajax. Le rappel sera « abort » comme textStatus pour que vous sachiez ce qui est arrivé:

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

Utiliser ajaxSetup n'est pas "faux", mais vous ne savez pas que ça va pour causer des problèmes jusqu'à ce qu'il le fasse ... et parfois quand c'est le cas, il est vraiment difficile de se rappeler que c'est ajaxSetup qui vous dérange. :-) +1 à cette réponse pour ne pas utiliser ajaxSetup. –

Questions connexes