À l'aide de jQuery, comment puis-je annuler / abandonner une demande Ajax dont je n'ai pas encore reçu la réponse?
javascript
jquery
ajax
tiède
la source
la source
$.ajaxStop
?ajaxStop
que ne détecte que lorsque toutes les demandes AJAX sont terminées, il n'arrête pas une demande. Dans mon expérience, vous l' utiliser comme ceci:$(document).ajaxStop(function(){alert("All done")})
. L'utilisation.abort()
est la meilleure option.Réponses:
La plupart des méthodes jQuery Ajax renvoient un objet XMLHttpRequest (ou l'équivalent), vous pouvez donc simplement l'utiliser
abort()
.Consultez la documentation:
MISE À JOUR: Depuis jQuery 1.5, l'objet renvoyé est un wrapper pour l'objet XMLHttpRequest natif appelé jqXHR. Cet objet semble exposer toutes les propriétés et méthodes natives afin que l'exemple ci-dessus fonctionne toujours. Voir L'objet jqXHR (documentation de l'API jQuery).
MISE À JOUR 2: À partir de jQuery 3, la méthode ajax retourne maintenant une promesse avec des méthodes supplémentaires (comme abandonner), donc le code ci-dessus fonctionne toujours, bien que l'objet renvoyé ne
xhr
soit plus. Voir le blog 3.0 ici .MISE À JOUR 3 :
xhr.abort()
fonctionne toujours sur jQuery 3.x. Ne présumez pas que la mise à jour 2 est correcte. Plus d'informations sur le référentiel jQuery Github .la source
abort
ne ferme pas une connexion établie avec le serveur, ilsuccess
sera donc toujours appelé. Ceci est très problématique pour les implémentations de Comet avec une longue interrogation..abort()
fonctionne toujours pour moi dans jQuery 3.2.1. Ce commentaire dans un problème lié à github par un membre de l'équipe principale de jQuery semble impliquer que cette réponse est incorrecte et qu'elle.abort()
n'a pas été supprimée.Vous ne pouvez pas rappeler la demande mais vous pouvez définir une valeur de temporisation après laquelle la réponse sera ignorée. Voir cette page pour les options jquery AJAX. Je crois que votre rappel d'erreur sera appelé si le délai d'expiration est dépassé. Il existe déjà un délai d'expiration par défaut pour chaque demande AJAX.
Vous pouvez également utiliser la abort () méthode sur l'objet de la demande , mais, alors qu'il fera le client d'arrêter d' écouter l'événement, il
peutprobablement pas arrêter le serveur de la traiter.la source
Il s'agit d'une demande asynchrone , ce qui signifie qu'une fois envoyée, elle est disponible.
Dans le cas où votre serveur démarre une opération très coûteuse en raison de la demande AJAX, le mieux que vous puissiez faire est d'ouvrir votre serveur pour écouter les demandes d'annulation et d'envoyer une demande AJAX distincte notifiant au serveur d'arrêter quoi qu'il fasse.
Sinon, ignorez simplement la réponse AJAX.
la source
Enregistrez les appels que vous effectuez dans un tableau, puis appelez xhr.abort () sur chacun.
ÉNORME CAVEAT: Vous pouvez abandonner une demande, mais ce n'est que du côté client. Le côté serveur pourrait toujours traiter la demande. Si vous utilisez quelque chose comme PHP ou ASP avec des données de session, les données de session sont verrouillées jusqu'à la fin de l'ajax. Donc, pour permettre à l'utilisateur de continuer à naviguer sur le site Web, vous devez appeler session_write_close (). Cela enregistre la session et la déverrouille afin que les autres pages en attente de continuer se poursuivent. Sans cela, plusieurs pages peuvent attendre que le verrou soit retiré.
la source
Les demandes AJAX peuvent ne pas se terminer dans l'ordre dans lequel elles ont été lancées. Au lieu d'abandonner, vous pouvez choisir d' ignorer toutes les réponses AJAX à l'exception de la plus récente:
Aperçu approximatif du code:
Démo sur jsFiddle
la source
Nous avons juste dû contourner ce problème et testé trois approches différentes.
Dans notre cas, nous avons décidé d'utiliser l'approche # 3 car elle produit moins de charge pour le serveur. Mais je ne suis pas sûr à 100% si jQuery garantit l'appel de la méthode .complete (), cela pourrait produire une situation de blocage. Dans nos tests, nous n'avons pas pu reproduire une telle situation.
la source
Il est toujours préférable de faire quelque chose comme ça.
Mais il est préférable de vérifier une instruction if pour vérifier si la demande ajax est nulle ou non.
la source
Appelez simplement xhr. abort () que ce soit un objet jquery ajax ou un objet XMLHTTPRequest natif.
exemple:
la source
Je faisais une solution de recherche en direct et je devais annuler les demandes en attente qui peuvent avoir pris plus de temps que la demande la plus récente / la plus récente.
Dans mon cas, j'ai utilisé quelque chose comme ça:
la source
Comme l'ont noté de nombreuses personnes sur le fil, juste parce que la demande est abandonnée côté client, le serveur traitera toujours la demande. Cela crée une charge inutile sur le serveur car il fait un travail que nous avons arrêté d'écouter sur le front-end.
Le problème que j'essayais de résoudre (que d'autres pourraient également rencontrer) est que lorsque l'utilisateur a entré des informations dans un champ de saisie, je voulais lancer une demande de type de sensation Google Instant.
Pour éviter de lancer des requêtes inutiles et pour maintenir la vivacité du front-end, j'ai fait ce qui suit:
Cela enverra essentiellement une demande toutes les 150 ms (une variable que vous pouvez personnaliser pour vos propres besoins). Si vous ne parvenez pas à comprendre ce qui se passe exactement ici, connectez
xhrCount
-vousxhrQueue
à la console juste avant le bloc if.la source
Utilisez simplement ajax.abort () par exemple, vous pouvez abandonner toute demande ajax en attente avant d'en envoyer une autre comme celle-ci.
la source
Vous pouvez abandonner tout appel ajax continu en utilisant ce
la source
il n'y a pas de moyen fiable de le faire, et je ne voudrais même pas l'essayer, une fois la demande en cours; la seule façon de réagir raisonnablement est d' ignorer la réponse.
dans la plupart des cas, cela peut se produire dans des situations comme: un utilisateur clique trop souvent sur un bouton déclenchant de nombreux XHR consécutifs, ici vous avez de nombreuses options, soit bloquez le bouton jusqu'à ce que XHR soit renvoyé, soit ne déclenchez même pas de nouveau XHR pendant qu'un autre est en cours d'exécution. l'utilisateur de se pencher en arrière - ou de rejeter toute réponse XHR en attente, mais la récente.
la source
Le code suivant montre le lancement et l'annulation d'une demande Ajax:
la source
J'ai eu le problème de l'interrogation et une fois la page fermée, le sondage s'est poursuivi, donc pour ma cause, un utilisateur manquerait une mise à jour car une valeur mysql était définie pour les 50 secondes suivantes après la fermeture de la page, même si j'ai tué la demande ajax, je figuré, l'utilisation de $ _SESSION pour définir une var ne se mettra pas à jour dans le sondage jusqu'à sa fin et une nouvelle a commencé, donc ce que j'ai fait a été de définir une valeur dans ma base de données comme 0 = offpage, alors que je suis interrogation Je recherche cette ligne et renvoie false; quand il est égal à 0, l'interrogation dans le sondage vous donnera évidemment les valeurs actuelles ...
J'espère que cela a aidé
la source
Si
xhr.abort();
provoque le rechargement de la page,Vous pouvez ensuite définir
onreadystatechange
avant d'abandonner pour éviter:la source
J'ai partagé une démo qui montre comment annuler une demande AJAX - si les données ne sont pas retournées par le serveur dans un délai d'attente prédéfini.
HTML:
CODE JS:
la source
$.ajax
fournit unetimeout
option pour que vous n'ayez pas besoin d'écrire la vôtre. Utilisez simplement..., data: {...}, timeout: waitTime,...
.