J'ai une demande AJAX qui sera faite toutes les 5 secondes. Mais le problème est avant la demande AJAX si la demande précédente n'est pas terminée, je dois abandonner cette demande et faire une nouvelle demande.
Mon code est quelque chose comme ça, 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);
);
Réponses:
La méthode jquery ajax renvoie un XMLHttpRequest objet . Vous pouvez utiliser cet objet pour annuler la demande.
XMLHttpRequest a une méthode d' abandon , qui annule la demande, mais si la demande a déjà été envoyée au serveur, le serveur traitera la demande même si nous abandonnons la demande, mais le client n'attendra pas / ne gérera pas la réponse.
L'objet xhr contient également un readyState qui contient l'état de la demande (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 et DONE-4). nous pouvons l'utiliser pour vérifier si la demande précédente a été traitée.
la source
readystate
ci-dessus etreadyState
ci - dessous, le caractères
est mis en majuscule dans jQuery 1.5if (xhr) xhr.abort();
fonctionnera très bien aussi.readystate
dans sa documentation. Il a toujours été mis en majusculereadyState
et jquery (avant ou après 1.5) correspond correctement à la spécification w3.Lorsque vous faites une demande à un serveur, faites-le vérifier pour voir si une progression n'est pas nulle (ou récupérer ces données) en premier. S'il récupère des données, abandonnez la demande précédente et lancez la nouvelle.
la source
Je sais que cela pourrait être un peu en retard, mais je rencontre des problèmes similaires où l'appel de la méthode d'abandon n'a pas vraiment avorté la demande. au lieu de cela, le navigateur attendait toujours une réponse qu'il n'utilise jamais. ce code a résolu ce problème.
la source
Pourquoi devriez-vous abandonner la demande?
Si chaque demande dure plus de cinq secondes, que se passera-t-il?
Vous ne devez pas abandonner la demande si le paramètre transmis avec la demande ne change pas. par exemple: - la demande concerne la récupération des données de notification. Dans de telles situations, l'approche intéressante consiste à définir une nouvelle demande uniquement après avoir terminé la demande Ajax précédente.
la source
Vous pouvez utiliser jquery-validate.js. Voici l'extrait de code de jquery-validate.js.
Pour que vous n'ayez à régler le mode des paramètres que pour annuler lorsque vous effectuez une demande ajax.
Réf: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
la source
jQuery: Utilisez-le comme point de départ - comme source d'inspiration. Je l'ai résolu comme ceci: (ce n'est pas une solution parfaite, il abandonne simplement la dernière instance et est du code WIP)
la source
Créez une fonction pour appeler votre API. Dans cette fonction, nous définissons la demande
callApiRequest = $.get(...
- même s'il s'agit d'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 d'appeler la demande, nous vérifions si notre variable est définietypeof(callApiRequest) != 'undefined'
et aussi si elle est en attentesuggestCategoryRequest.state() == 'pending'
- si les deux sont vraies, nous.abort()
la demande qui empêchera le rappel de succès de s'exécuter.Votre serveur / API peut ne pas prendre en charge l'abandon de la demande (que faire si l'API a déjà exécuté du code?), Mais le rappel javascript ne se déclenchera pas. Ceci est utile lorsque, par exemple, vous fournissez des suggestions de saisie à un utilisateur, telles que la saisie de hashtags.
Vous pouvez étendre cette fonction en ajoutant la définition du rappel d'erreur - ce qui devrait se produire si la demande a été abandonnée.
Le cas d'utilisation courant de cet extrait serait une entrée de texte qui se déclenche lors d'un
keypress
événement. Vous pouvez utiliser un délai d'expiration pour empêcher l'envoi (de certaines) demandes que vous devrez annuler.abort()
.la source
Vous devez également rechercher readyState 0. Parce que lorsque vous utilisez xhr.abort (), cette fonction définit readyState à 0 dans cet objet, et votre vérification if sera toujours vraie - readyState! = 4
la source