UNPKG

vtex.js

Version:
65 lines (60 loc) 1.87 kB
(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);