Quelle est la meilleure façon de relancer une requête AJAX en cas d'échec à l'aide de jQuery?
Pseudo-code:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Même mieux serait une sorte de l'algorithme de reprise
- Je ne suis pas sûr si c'est le meilleur moyen à tous, donc, juste un commentaire, mais si vous appelez votre ajax à partir d'un fucntion, vous pouvez lui donner un paramètre
tries
, et sur l'échec que vous appelez votre fonction avectries+1
. Arrêter l'exécution surtries==3
ou n'importe quel autre numéro. - double possible de Rejuger l'ajax de jquery demande qui comporte des rappels attaché à son différés
- Belle solution ici: stackoverflow.com/questions/6298612/...
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ceci:
.success
est joint à l'appel de la fonction qui retourne cette requête ajax?tryCount
etretryLimit
est excessif. Pensez à utiliser seulement 1 variable:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
timeout : 3000
, puis a augmenté le délai d'attente à chaque nouvelle tentative:this.timeout = this.timeout * this.tryCount;
peut-être il pourrait donner plus de temps pour toute demande de revenir avec une réponse.var tryCount = 0
et modifier toutes les instances dethis.tryCount
àtryCount
this
reportez-vous à l'erreur en fonction de rappel plutôt que l'objet passé en$.ajax()
?Une approche consiste à utiliser une fonction wrapper:
Une autre approche serait d'utiliser un
retries
bien sur la$.ajax
D'une autre façon (GIST) - remplacer les originaux
$.ajax
(plus SEC)Un point à prendre en compte est de faire sûr la
$.ajax
méthode n'était pas déjà enveloppé précédemment, afin d'éviter le même code exécuté deux fois.Vous pouvez copier-coller de ces fragments (as-is) à la console pour tester
J'ai eu beaucoup de succès avec ce code ci-dessous (exemple: http://jsfiddle.net/uZSFK/)
Voici un petit plugin pour cela:
https://github.com/execjosh/jquery-ajax-retry
Auto-incrémentation de délai d'attente serait un bon ajout à elle.
De l'utiliser à l'échelle mondiale tout simplement créer votre propre fonction avec $.ajax signature, il y réessayer de l'api et de remplacer tous vos $.les appels ajax par votre nouvelle fonction.
Vous pouvez également remplacer directement $.ajax, mais vous ne serez pas en mesure de faire xhr les appels sans nouvelle tentative alors.
Voici la méthode qui a fonctionné pour moi pendant le chargement asynchrone des bibliothèques:
Puis il suffit d'appeler
.load_script
à partir de votre application et de votre nid succès de rappel:DemoUsers réponse ne fonctionne pas avec Zepto, depuis cet dans la fonction d'erreur est pointant vers la Fenêtre. (Et cette façon de l'utilisation de 'ce' est pas assez sûr que vous ne savez pas comment ils mettent en œuvre ajax ou pas besoin d'.)
Pour Zepto, peut-être que vous pourriez essayer ci-dessous, jusqu'à maintenant, il fonctionne bien pour moi:
Utiliser le constructeur pour assurer la demande est réentrant!
Aucune de ces réponses de travail si quelqu'un m'appelle
.done()
après leur appel ajax car vous n'aurez pas le succès de la méthode pour attacher à l'avenir, de retour d'appel. Donc, si quelqu'un cela:Puis
mySuccessFunc
n'obtiendrez pas appelé sur le réessayer. Voici ma solution, qui est largement emprunté à @cjpak la réponse de ici. Dans mon cas, je veux réessayer quand AWS Passerelle API répond avec une erreur 502.Cet extrait de back-off et recommencer après 2 secondes, 5 secondes, 10 secondes, que vous pouvez modifier en modifiant la RETRY_WAIT constante.
AWS support nous a suggéré d'ajouter une nouvelle tentative, comme il arrive pour nous qu'une seule fois dans une lune bleue.