// enhance the original "$.ajax" with a retry mechanism
$.ajax = (($oldAjax) => {
// on fail, retry by creating a new Ajax deferred
function check(a,b,c){
var shouldRetry = b != 'success' && b != 'parsererror';
if( shouldRetry && --this.retries > 0 )
setTimeout(() => { $.ajax(this) }, this.retryInterval || 100);
}
return settings => $oldAjax(settings).always(check)
})($.ajax);
// now we can use the "retries" property if we need to retry on fail
$.ajax({
type : 'GET',
url : 'http://www.whatever123.gov',
timeout : 2000,
retries : 3, // <-------- Optional
retryInterval : 2000 // <-------- Optional
})
// Problem: "fail" will only be called once, and not for each retry
.fail(()=>{
console.log('failed')
});
9条答案
按热度按时间ss2ws0br1#
大概是这样的
hof1towb2#
一种方法是使用 Package 函数:
另一种方法是在
$.ajax
上使用retries
属性另一种方式(GIST)-覆盖原始
$.ajax
(更适合DRY)要考虑的一点是确保
$.ajax
方法之前没有 Package ,以避免相同的代码运行两次。您可以将这些代码段(按原样)复制粘贴到控制台以进行测试
xcitsw883#
我已经用下面的代码取得了很大的成功(例如:http://jsfiddle.net/uZSFK/)
bq9c1y664#
如果有人在 AJAX 调用之后调用
.done()
,这些答案都不起作用,因为你没有success方法来附加到将来的回调中。那么
mySuccessFunc
不会在重试时被调用。下面是我的解决方案,它大量借用了@cjpak的答案here。在我的例子中,我希望在AWS的API网关响应502错误时重试。这个代码段将在2秒、5秒、10秒后回退并重试,您可以通过修改RETRY_WAIT常量来编辑这一点。
AWS支持建议我们添加重试,因为它对我们来说只有一次。
kfgdxczn5#
您的代码几乎已满:)
oxcyiej76#
下面是一个小插件:
https://github.com/execjosh/jquery-ajax-retry
自动增加超时将是一个很好的补充。
要在全球范围内使用它,只需创建您自己的带有$. AJAX 签名的函数,使用there retry API并将所有$.ajax调用替换为新函数。
你也可以直接替换$. AJAX ,但是如果不重试,你将无法调用xhr。
93ze6v8z7#
下面是我异步加载库的方法:
然后,只需从应用调用
.load_script
并嵌套成功回调即可:rjjhvcjd8#
DemoUsers的答案在Zepto中不起作用,因为error函数中的this指向Window(使用'this'的方式不够安全,因为你不知道他们是如何实现 AJAX 的,或者没有必要知道)。
对于Zepto,也许你可以试试下面的,到目前为止,它对我来说效果很好:
使用构造函数来确保请求是可重入的!
xggvc2p69#
我用@vsync第三个代码解决了我的具体问题。