Pseudo code:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Encore mieux serait une sorte de recul exponentiel
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
la source
la source
tries
, et en cas d'échec, vous appelez votre fonction avectries+1
. Arrêtez l'exécution surtries==3
ou tout autre numéro.Réponses:
Quelque chose comme ça:
la source
.success
est attaché à l'appel de la fonction qui renvoie cette requête ajax?tryCount
etretryLimit
est excessif. Envisagez d'utiliser seulement 1 variable:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Une approche consiste à utiliser une fonction wrapper:
Une autre approche consisterait à utiliser une
retries
propriété sur le$.ajax
Une autre façon ( GIST ) - remplacer l'original
$.ajax
(mieux pour DRY)Un point à considérer est de s'assurer que la
$.ajax
méthode n'a pas déjà été encapsulée précédemment, afin d'éviter que le même code ne s'exécute deux fois.Vous pouvez copier-coller ces extraits (tels quels) dans la console pour les tester
la source
J'ai eu beaucoup de succès avec ce code ci-dessous (exemple: http://jsfiddle.net/uZSFK/ )
la source
Aucune de ces réponses ne fonctionne si quelqu'un appelle
.done()
après son appel ajax car vous n'aurez pas la méthode de réussite pour vous attacher au futur rappel. Donc, si quelqu'un fait ça:Ensuite
mySuccessFunc
, vous ne serez pas appelé lors de la nouvelle tentative. Voici ma solution, qui est largement empruntée à la réponse de @ cjpak ici . Dans mon cas, je souhaite réessayer lorsque la passerelle API d'AWS répond avec une erreur 502.Cet extrait de code s'arrêtera et réessayera après 2 secondes, puis 5 secondes, puis 10 secondes, que vous pouvez modifier en modifiant la constante RETRY_WAIT.
Le support AWS nous a suggéré d'ajouter une nouvelle tentative, car cela ne se produit qu'une seule fois dans une lune bleue.
la source
Voici un petit plugin pour cela:
https://github.com/execjosh/jquery-ajax-retry
Le délai d'incrémentation automatique serait un bon ajout à cela.
Pour l'utiliser globalement, créez simplement votre propre fonction avec la signature $ .ajax, utilisez-la pour réessayer api et remplacez tous vos appels $ .ajax par votre nouvelle fonction.
Vous pouvez également remplacer directement $ .ajax, mais vous ne pourrez pas faire d'appels xhr sans réessayer.
la source
Voici la méthode qui a fonctionné pour moi pour le chargement asynchrone des bibliothèques:
Ensuite, appelez simplement
.load_script
depuis votre application et imbriquez votre rappel de réussite:la source
La réponse de DemoUsers ne fonctionne pas avec Zepto, car cela dans la fonction d'erreur pointe vers Window. (Et cette façon d'utiliser 'this' n'est pas suffisamment sécurisée car vous ne savez pas comment ils implémentent ajax ou pas besoin de le faire.)
Pour Zepto, vous pourriez peut-être essayer ci-dessous, jusqu'à présent, cela fonctionne bien pour moi:
Utilisez le constructeur pour vous assurer que la requête est réentrante!
la source
Votre code est presque plein :)
la source