Pseudo código:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Incluso mejor sería una especie de retroceso exponencial
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
fuente
fuente
tries
y, en caso de falla, llamas a tu función contries+1
. Detenga la ejecución entries==3
o cualquier otro número.Respuestas:
Algo como esto:
fuente
.success
Funcionará esto si se adjunta otro controlador de devolución de llamada como para llamar a la función que devuelve esta solicitud ajax?tryCount
yretryLimit
es excesivo. Considere usar solo 1 variable:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Un enfoque es utilizar una función contenedora:
Otro enfoque sería utilizar una
retries
propiedad en el$.ajax
Otra forma ( GIST ): anular original
$.ajax
(mejor para DRY)Un punto a considerar es asegurarse de que el
$.ajax
método no haya sido empaquetado previamente para evitar que el mismo código se ejecute dos veces.Puede copiar y pegar estos fragmentos (tal cual) en la consola para probarlos
fuente
He tenido mucho éxito con este código a continuación (ejemplo: http://jsfiddle.net/uZSFK/ )
fuente
Ninguna de estas respuestas funciona si alguien llama
.done()
después de su llamada ajax porque no tendrá el método de éxito para adjuntar a la futura devolución de llamada. Entonces, si alguien hace esto:Entonces
mySuccessFunc
no se llamará en el reintento. Aquí está mi solución, que está muy tomada de la respuesta de @ cjpak aquí . En mi caso, quiero volver a intentarlo cuando API Gateway de AWS responda con el error 502.Este fragmento retrocederá y volverá a intentarlo después de 2 segundos, luego 5 segundos, luego 10 segundos, que puede editar modificando la constante RETRY_WAIT.
El soporte de AWS sugirió que agreguemos un reintento, ya que nos sucede solo una vez en una luna azul.
fuente
Aquí hay un pequeño complemento para esto:
https://github.com/execjosh/jquery-ajax-retry
Incrementar automáticamente el tiempo de espera sería una buena adición.
Para usarlo globalmente, simplemente cree su propia función con la firma $ .ajax, use la API de reintento y reemplace todas sus llamadas a $ .ajax por su nueva función.
También puede reemplazar directamente $ .ajax, pero no podrá realizar llamadas xhr sin volver a intentarlo.
fuente
Aquí está el método que funcionó para mí para la carga asincrónica de bibliotecas:
Luego, simplemente llame
.load_script
desde su aplicación y anide su devolución de llamada exitosa:fuente
La respuesta de DemoUsers no funciona con Zepto, ya que esto en la función de error apunta a Window. (Y esa forma de usar 'esto' no es lo suficientemente segura ya que no sabe cómo implementan ajax o no es necesario).
Para Zepto, tal vez puedas probar a continuación, hasta ahora funciona bien para mí:
Use el constructor para asegurarse de que la solicitud sea reentrante.
fuente
Tu código está casi lleno :)
fuente