Ajax请求的自动重试与中断策略
实现智能的Ajax管理器:超时重试、幂等请求去重、手动中断所有 pending 请求,结合$.Deferred。 · 难度:入门 · +10XP
Ajax请求的自动重试与中断策略
简单的$.ajax无法处理网络不稳定或重复提交。本教程构建一个请求队列,每个请求有重试次数上限和指数退避延迟。当新请求与未完成的请求URL+方法相同时,自动中止旧请求(防止重复提交)。同时提供全局中断接口(如页面跳转时调用abortAll())。借助jQuery的XHR对象(返回的jqXHR)以及Deferred的notify方法,还可以实现上传进度反馈。
function ajaxWithRetry(url, options, retries = 3) {
var dfd = $.Deferred();
function attempt(n) {
$.ajax(url, options)
.done(dfd.resolve)
.fail(function(jqXHR, textStatus) {
if (n > 0 && textStatus === 'timeout') {
setTimeout(function() { attempt(n-1); }, 1000 * (retries-n+1));
} else {
dfd.reject(jqXHR, textStatus);
}
});
}
attempt(retries);
return dfd.promise();
}