Pseudocode:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Noch besser wäre eine Art exponentieller Rückzieher
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
quelle
quelle
tries
, und wenn dies fehlschlägt, rufen Sie Ihre Funktion mit auftries+1
. Beenden Sie die Ausführung auftries==3
oder einer anderen Nummer.Antworten:
Etwas wie das:
quelle
.success
der Aufruf der Funktion, die diese Ajax-Anforderung zurückgibt, angehängt ist?tryCount
undretryLimit
ist übertrieben. Verwenden Sie nur 1 Variable:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Ein Ansatz ist die Verwendung einer Wrapper-Funktion:
Ein anderer Ansatz wäre die Verwendung einer
retries
Eigenschaft auf dem$.ajax
Ein anderer Weg ( GIST ) - Original überschreiben
$.ajax
(besser für DRY)Ein zu berücksichtigender Punkt ist, sicherzustellen , dass die
$.ajax
Methode noch nicht zuvor umbrochen wurde, um zu vermeiden, dass derselbe Code zweimal ausgeführt wird.Sie können diese Snippets (wie sie sind) kopieren und in die Konsole einfügen, um sie zu testen
quelle
Ich habe mit diesem Code unten viel Erfolg gehabt (Beispiel: http://jsfiddle.net/uZSFK/ )
quelle
Keine dieser Antworten funktioniert, wenn jemand
.done()
nach seinem Ajax-Anruf anruft , da Sie nicht über die Erfolgsmethode verfügen, die Sie an den zukünftigen Rückruf anhängen können. Also, wenn jemand dies tut:Dann
mySuccessFunc
wird der Wiederholungsversuch nicht aufgerufen. Hier ist meine Lösung, die stark von der Antwort von @ cjpak hier entlehnt ist . In meinem Fall möchte ich es erneut versuchen, wenn das API-Gateway von AWS mit einem 502-Fehler antwortet.Dieses Snippet wird nach 2 Sekunden, dann nach 5 Sekunden und nach 10 Sekunden zurückgesetzt und erneut versucht. Sie können es bearbeiten, indem Sie die Konstante RETRY_WAIT ändern.
Der AWS-Support schlug vor, einen erneuten Versuch hinzuzufügen, da dies bei einem blauen Mond nur einmal vorkommt.
quelle
Hier ist ein kleines Plugin dafür:
https://github.com/execjosh/jquery-ajax-retry
Das Zeitlimit für die automatische Inkrementierung wäre eine gute Ergänzung.
Um es global zu verwenden, erstellen Sie einfach Ihre eigene Funktion mit der Signatur $ .ajax, verwenden Sie dort die Wiederholungs-API und ersetzen Sie alle Ihre $ .ajax-Aufrufe durch Ihre neue Funktion.
Sie könnten auch $ .ajax direkt ersetzen, aber Sie können dann keine xhr-Aufrufe tätigen, ohne es erneut zu versuchen.
quelle
Hier ist die Methode, die für mich beim asynchronen Laden von Bibliotheken funktioniert hat:
Rufen
.load_script
Sie dann einfach von Ihrer App aus an und verschachteln Sie Ihren Erfolgsrückruf:quelle
Die Antwort von DemoUsers funktioniert nicht mit Zepto, da dies in der Fehlerfunktion auf Window zeigt. (Und diese Art der Verwendung von 'this' ist nicht sicher genug, da Sie nicht wissen, wie sie Ajax implementieren oder nicht müssen.)
Für Zepto könnten Sie es vielleicht unten versuchen, bis jetzt funktioniert es gut für mich:
Verwenden Sie den Konstruktor, um sicherzustellen, dass die Anforderung erneut eingegeben wird!
quelle
Dein Code ist fast voll :)
quelle