Pseudo kod:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Jeszcze lepszy byłby jakiś wykładniczy wycofanie się
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
źródło
źródło
tries
, a w przypadku niepowodzenia wywołujesz swoją funkcję za pomocątries+1
. Zatrzymaj wykonywanie natries==3
lub dowolnej innej liczbie.Odpowiedzi:
Coś takiego:
źródło
.success
jest dołączony do wywołania funkcji, która zwraca to żądanie ajax?tryCount
iretryLimit
jest nadmierna. Rozważ użycie tylko jednej zmiennej:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Jednym ze sposobów jest użycie funkcji opakowującej:
Innym podejściem byłoby użycie
retries
właściwości w$.ajax
Inny sposób ( GIST ) - zastąp oryginał
$.ajax
(lepszy dla DRY)Punkt do rozważenia jest co pewien
$.ajax
metoda nie była już owinięty wcześniej, aby uniknąć tego samego kodu działa dwukrotnie.Możesz skopiować i wkleić te fragmenty (tak jak jest) do konsoli, aby je przetestować
źródło
Z tym kodem poniżej odniosłem duży sukces (przykład: http://jsfiddle.net/uZSFK/ )
źródło
Żadna z tych odpowiedzi nie zadziała, jeśli ktoś zadzwoni
.done()
po wywołaniu Ajax, ponieważ nie będziesz mieć metody sukcesu, aby dołączyć do przyszłego połączenia zwrotnego. Więc jeśli ktoś to robi:Wtedy
mySuccessFunc
nie zostanie wywołany przy ponownej próbie. Oto moje rozwiązanie, które jest mocno zapożyczone z odpowiedzi @ cjpak tutaj . W moim przypadku chcę spróbować ponownie, gdy AWS API Gateway odpowie z błędem 502.Ten fragment wycofa się i spróbuje ponownie po 2 sekundach, następnie 5 sekundach, a następnie 10 sekundach, co można edytować, modyfikując stałą RETRY_WAIT.
Wsparcie AWS zasugerowało dodanie ponownej próby, ponieważ zdarza się to tylko raz na niebieskim księżycu.
źródło
Oto mała wtyczka do tego:
https://github.com/execjosh/jquery-ajax-retry
Automatyczne zwiększanie limitu czasu byłoby dobrym dodatkiem do tego.
Aby używać go globalnie, po prostu utwórz własną funkcję z podpisem $ .ajax, użyj api ponawiania i zastąp wszystkie wywołania $ .ajax nową funkcją.
Możesz także bezpośrednio zamienić $ .ajax, ale nie będziesz mógł wtedy wykonywać wywołań xhr bez ponownej próby.
źródło
Oto metoda, która zadziałała dla mnie w przypadku asynchronicznego ładowania bibliotek:
Następnie po prostu zadzwoń
.load_script
z aplikacji i zagnieżdż swoje udane wywołanie zwrotne:źródło
Odpowiedź DemoUsers nie działa z Zepto, ponieważ to w funkcji błędu wskazuje na Window. (A ten sposób używania 'this' nie jest wystarczająco bezpieczny, ponieważ nie wiesz, jak implementują Ajax lub nie ma takiej potrzeby).
W przypadku Zepto może mógłbyś spróbować poniżej, do tej pory działa dobrze dla mnie:
Użyj konstruktora, aby upewnić się, że żądanie zostanie ponownie wprowadzone!
źródło
Twój kod jest prawie pełny :)
źródło