Created
October 11, 2012 13:27
-
-
Save ryan-nauman/3872268 to your computer and use it in GitHub Desktop.
Retrying an ajax request supporting error/success callbacks as well as promises
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$.ajaxPrefilter(function (options, originalOptions, jqXHR) { | |
// Don't infinitely recurse | |
originalOptions._retry = isNaN(originalOptions._retry) | |
? Common.auth.maxExpiredAuthorizationRetries | |
: originalOptions._retry - 1; | |
// set up to date authorization header with every request | |
jqXHR.setRequestHeader("Authorization", Common.auth.getAuthorizationHeader()); | |
// save the original error callback for later | |
if (originalOptions.error) | |
originalOptions._error = originalOptions.error; | |
// overwrite *current request* error callback | |
options.error = $.noop(); | |
// setup our own deferred object to also support promises that are only invoked | |
// once all of the retry attempts have been exhausted | |
var dfd = $.Deferred(); | |
jqXHR.done(dfd.resolve); | |
// if the request fails, do something else yet still resolve | |
jqXHR.fail(function () { | |
var args = Array.prototype.slice.call(arguments); | |
if (jqXHR.status === 401 && originalOptions._retry > 0) { | |
// refresh the oauth credentials for the next attempt(s) | |
// (will be stored and returned by Common.auth.getAuthorizationHeader()) | |
Common.auth.handleUnauthorized(); | |
// retry with our modified | |
$.ajax(originalOptions).then(dfd.resolve, dfd.reject); | |
} else { | |
// add our _error callback to our promise object | |
if (originalOptions._error) | |
dfd.fail(originalOptions._error); | |
dfd.rejectWith(jqXHR, args); | |
} | |
}); | |
// NOW override the jqXHR's promise functions with our deferred | |
return dfd.promise(jqXHR); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment