Pseudo-código:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Melhor ainda seria algum tipo de recuo exponencial
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
fonte
fonte
tries
e, em caso de falha, chamar sua função comtries+1
. Pare a execução emtries==3
ou qualquer outro número.Respostas:
Algo assim:
fonte
.success
estiver vinculado à chamada da função que retorna esta solicitação ajax?tryCount
eretryLimit
é excessivo. Considere o uso de apenas uma variável:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Uma abordagem é usar uma função de wrapper:
Outra abordagem seria usar uma
retries
propriedade no$.ajax
Outra forma ( GIST ) - sobrescrever original
$.ajax
(melhor para DRY)Um ponto a ser considerado é ter certeza de que o
$.ajax
método já não foi agrupado anteriormente, para evitar que o mesmo código seja executado duas vezes.Você pode copiar e colar esses snippets (no estado em que se encontram) no console para testá-los
fonte
Tive muito sucesso com este código abaixo (exemplo: http://jsfiddle.net/uZSFK/ )
fonte
Nenhuma dessas respostas funciona se alguém ligar
.done()
após sua chamada de ajax, porque você não terá o método de sucesso para anexar à chamada de retorno futura. Então, se alguém fizer isso:Então
mySuccessFunc
não será chamado na nova tentativa. Aqui está minha solução, que foi muito emprestada da resposta de @cjpak aqui . No meu caso, quero tentar novamente quando o API Gateway da AWS responder com o erro 502.Este snippet recuará e tentará novamente após 2 segundos, depois 5 segundos e depois 10 segundos, que você pode editar modificando a constante RETRY_WAIT.
O suporte da AWS sugeriu que adicionássemos uma nova tentativa, já que isso acontece para nós apenas uma vez em uma lua azul.
fonte
Aqui está um pequeno plugin para isso:
https://github.com/execjosh/jquery-ajax-retry
O incremento automático do tempo limite seria uma boa adição a ele.
Para usá-lo globalmente, basta criar sua própria função com a assinatura $ .ajax, usar a api de nova tentativa e substituir todas as suas chamadas $ .ajax por sua nova função.
Além disso, você pode substituir $ .ajax diretamente, mas não poderá fazer chamadas xhr sem tentar novamente.
fonte
Este é o método que funcionou para mim para carregamento assíncrono de bibliotecas:
Em seguida, basta chamar
.load_script
de seu aplicativo e aninhar seu retorno de chamada de sucesso:fonte
A resposta do DemoUsers não funciona com o Zepto, já que esta na função de erro está apontando para a janela. (E essa forma de usar 'this' não é segura o suficiente, pois você não sabe como eles implementam ajax ou não precisa fazer isso.)
Para Zepto, talvez você possa tentar abaixo, até agora funciona bem para mim:
Use o construtor para garantir que a solicitação seja reentrante!
fonte
Seu código está quase cheio :)
fonte