Étant donné une requête Ajax dans AngularJS
$http.get("/backend/").success(callback);
quel est le moyen le plus efficace d'annuler cette requête si une autre requête est lancée (même backend, paramètres différents par exemple).
Étant donné une requête Ajax dans AngularJS
$http.get("/backend/").success(callback);
quel est le moyen le plus efficace d'annuler cette requête si une autre requête est lancée (même backend, paramètres différents par exemple).
promise.abort()
stackoverflow.com/a/50415480/984780Réponses:
Cette fonctionnalité a été ajoutée à la version 1.1.5 via un paramètre de délai d'expiration:
la source
setTimeout
fonction native de JavaScript, soit avec le$timeout
service Angular .L'annulation d'Angular $ http Ajax avec la propriété timeout ne fonctionne pas dans Angular 1.3.15. Pour ceux qui ne peuvent pas attendre que cela soit corrigé, je partage une solution jQuery Ajax enveloppée dans Angular.
La solution passe par deux services:
Voici le service PendingRequestsService:
Le service HttpService:
Plus tard dans votre service, lorsque vous chargez des données, vous utiliserez HttpService au lieu de $ http:
Plus tard dans votre code, vous souhaitez charger les données:
la source
L'annulation des demandes émises avec
$http
n'est pas prise en charge avec la version actuelle d'AngularJS. Il y a une demande de tirage ouverte pour ajouter cette capacité, mais ce PR n'a pas encore été examiné, il n'est donc pas clair s'il va devenir le noyau AngularJS.la source
Si vous souhaitez annuler les demandes en attente sur stateChangeStart avec ui-router, vous pouvez utiliser quelque chose comme ceci:
// en service
// dans la configuration d'UIrouter
la source
request.timeout
est présente?Pour une raison quelconque, config.timeout ne fonctionne pas pour moi. J'ai utilisé cette approche:
Et cancelRequest.resolve () pour annuler. En fait, cela n'annule pas une demande mais vous n'obtenez au moins aucune réponse inutile.
J'espère que cela t'aides.
la source
{ cancelPromise, httpPromise }
?Cela améliore la réponse acceptée en décorant le service $ http avec une méthode d'abandon comme suit ...
QUE FAIT CE CODE?
Pour annuler une demande, un délai d'expiration de «promesse» doit être défini. Si aucun délai d'expiration n'est défini sur la requête HTTP, le code ajoute un délai d'expiration «promesse». (Si un délai d'expiration est déjà défini, rien n'est changé).
Cependant, pour résoudre la promesse, nous avons besoin d'une poignée sur le «différé». On utilise donc une carte pour pouvoir récupérer le "différé" plus tard. Lorsque nous appelons la méthode d'abandon, le "différé" est récupéré de la carte, puis nous appelons la méthode de résolution pour annuler la requête http.
J'espère que cela aide quelqu'un.
LIMITES
Actuellement, cela ne fonctionne que pour $ http.get mais vous pouvez ajouter du code pour $ http.post et ainsi de suite
COMMENT UTILISER ...
Vous pouvez ensuite l'utiliser, par exemple, lors d'un changement d'état, comme suit ...
la source
voici une version qui gère plusieurs demandes, vérifie également l'état annulé dans le rappel pour supprimer les erreurs dans le bloc d'erreur. (en tapuscrit)
niveau du contrôleur:
dans mon http obtenir:
méthodes d'assistance
maintenant en regardant l'onglet réseau, je vois que cela fonctionne à merveille. J'ai appelé la méthode 4 fois et seule la dernière est passée.
la source
Vous pouvez ajouter une fonction personnalisée au
$http
service en utilisant un "décorateur" qui ajouterait laabort()
fonction à vos promesses.Voici un code de travail:
Ce code utilise la fonctionnalité de décorateur d'angularjs pour ajouter une
with_abort()
fonction au$http
service.with_abort()
utilise l'$http
option de délai d'expiration qui vous permet d'annuler une requête http.La promesse retournée est modifiée pour inclure une
abort()
fonction. Il a également du code pour s'assurer que celaabort()
fonctionne même si vous enchaînez les promesses.Voici un exemple de la façon dont vous l'utiliseriez:
Par défaut, lorsque vous appelez,
abort()
la demande est annulée et aucun des gestionnaires de promesse ne s'exécute.Si vous voulez que vos gestionnaires d'erreurs soient appelés, passez true à
abort(true)
.Dans votre gestionnaire d'erreurs, vous pouvez vérifier si "l'erreur" est due à un "abandon" en vérifiant la
xhrStatus
propriété. Voici un exemple:la source