vtex.js
Version:
VTEX JS SDK
65 lines (60 loc) • 1.87 kB
JavaScript
(function() {
var events, pipeFailRetry;
events = {
AJAX_RETRY: 'ajaxRetry.vtex',
AJAX_ERROR: 'ajaxError.vtex'
};
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
jqXHR.retry = function(opts) {
if (opts.timeout) {
this.timeout = opts.timeout;
}
if (opts.statusCodes) {
this.statusCodes = opts.statusCodes;
}
return this.pipe(null, pipeFailRetry(this, opts));
};
});
pipeFailRetry = function(jqXHR, opts) {
var timeout, times;
times = opts.times;
timeout = jqXHR.timeout;
return function(input, status, msg) {
var ajaxOptions, nextRequest, output, retryAfter;
ajaxOptions = this;
output = new $.Deferred;
retryAfter = jqXHR.getResponseHeader('Retry-After');
nextRequest = function() {
$.ajax(ajaxOptions).retry({
times: times - 1,
timeout: opts.timeout,
statusCodes: opts.statusCodes
}).pipe(output.resolve, output.reject);
};
if (times > 1 && (!jqXHR.statusCodes || $.inArray(input.status, jqXHR.statusCodes) > -1)) {
$(window).trigger(events.AJAX_RETRY, input);
if (retryAfter) {
if (isNaN(retryAfter)) {
timeout = new Date(retryAfter).getTime() - $.now();
} else {
timeout = parseInt(retryAfter, 10) * 1000;
}
if (isNaN(timeout) || timeout < 0) {
timeout = jqXHR.timeout;
}
}
if (timeout !== void 0) {
setTimeout(nextRequest, timeout);
} else {
nextRequest();
}
} else {
if (input.statusText !== 'abort' || jqXHR.statusText !== 'abort') {
$(window).trigger(events.AJAX_ERROR, input);
}
output.rejectWith(this, arguments);
}
return output;
};
};
}).call(this);