Comment annuler/abandonner jQuery AJAX demande?
J'ai une requête AJAX qui va être faite tous les 5 secondes. Mais le problème est avant la requête AJAX si la demande antérieure n'est pas terminé, j'ai pour annuler cette demande et de faire une nouvelle demande.
Mon code est quelque chose comme cela, comment résoudre ce problème?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
- double possible de Tuer des requêtes ajax en javascript à l'aide de jquery.
- Votre question, les états la demande devrait se produire toutes les 5 secondes, mais le code utilise 500 ms = 0,5 s.
Vous devez vous connecter pour publier un commentaire.
L'ajax de jquery méthode retourne un XMLHttpRequest objet. Vous pouvez utiliser cet objet pour annuler la demande.
XMLHttpRequest a un abandonner méthode, qui annule la demande, mais si la demande a déjà été envoyé au serveur puis le serveur va traiter la demande même si nous abandonner la demande, mais le client ne sera pas attendre pour/gérer la réponse.
L'objet xhr contient également un readyState qui contient l'état de la demande(NON-0, OUVRE-1, HEADERS_RECEIVED-2, le CHARGEMENT-3 et FAITES-4). nous pouvons l'utiliser pour vérifier si la demande précédente a été terminée.
readystate
ci-dessus etreadyState
ci-dessous, le caractères
est en majuscule dans jQuery 1.5if (xhr) xhr.abort();
fonctionnent très bien aussi.readystate
dans sa documentation. Il a toujours été capitalisésreadyState
et jquery (avant ou après 1,5) correspondent correctement le w3 spécification.AjaxHelper
? .abort() n'est pas de travail pour elleJe sais que cela pourrait être un peu tard, mais j'ai connu des problèmes similaires où l'appel de la méthode abort n'a pas vraiment abandonné la demande. au lieu de cela, le navigateur était toujours en attente d'une réponse qu'il n'utilise jamais.
ce code résolu cette question.
Lorsque vous effectuez une requête à un serveur, vérifier pour voir si un cours n'est pas null (ou extraction des données) en premier. Si c'est de l'extraction de données, abandonner la demande précédente, et de lancer la nouvelle.
Pourquoi devriez-vous annuler la demande?
Si chaque demande plus de cinq secondes, ce qui va arriver?
Vous ne devriez pas abandonner la demande si le passage de paramètres à la demande n'est pas en train de changer.
par exemple:- la demande est pour récupérer les données de notification.
Dans de telles situations, La bonne approche est que de définir une nouvelle demande qu'après avoir terminé la précédente requête Ajax.
Vous pouvez utiliser jquery-validate.js . Ce qui suit est l'extrait de code de jquery-validate.js.
De sorte que vous ne devez définir le paramètre mode à abandonner lorsque vous effectuez une requête ajax.
Ref:https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
jQuery:
L'utiliser comme un point de départ - comme source d'inspiration.
Je l'ai résolu comme ceci:
(ce n'est pas une solution parfaite, c'est juste abandonne la dernière instance et est WIP code)
Créer une fonction pour appeler votre API. Au sein de cette fonction, nous définissons demande
callApiRequest = $.get(...
- même si c'est une définition d'une variable, la demande est appelée immédiatement, mais nous avons maintenant la demande définie comme une variable. Avant que la demande est appelée, nous vérifions si notre variable est définietypeof(callApiRequest) != 'undefined'
et aussi si il est en attente d'suggestCategoryRequest.state() == 'pending'
- si les deux sont vrais, nous.abort()
la demande qui va empêcher le succès de rappel à partir de l'exécution.Votre serveur/API ne pouvait pas soutenir l'abandon de la demande (si l'API exécuté un code déjà?), mais le javascript de rappel ne fera pas de feu. Ceci est utile, par exemple lorsque vous êtes en fournissant des suggestions des suggestions pour un utilisateur, telles que les hashtags d'entrée.
Vous pouvez encore étendre cette fonction par l'ajout de la définition de l'erreur de rappel - ce qui se passerait si la demande a été abandonnée.
Commune de cas d'utilisation pour cet extrait serait un texte d'entrée qui déclenche
keypress
événement. Vous pouvez utiliser un délai d'attente, pour éviter l'envoi de (certains de) les demandes que vous aurez à annuler.abort()
.Vous devriez également vérifier pour readyState 0. Parce que lorsque vous utilisez xhr.abort() cette fonction readyState à 0 dans cet objet, et si votre chèque sera toujours vrai - readyState !=4