Skip to content

Instantly share code, notes, and snippets.

@swissmanu
Last active February 15, 2018 08:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save swissmanu/d760699b8c97115c4f22e41534b2c36a to your computer and use it in GitHub Desktop.
Save swissmanu/d760699b8c97115c4f22e41534b2c36a to your computer and use it in GitHub Desktop.
Typed eventually construct using TypeScript and Promises
// Example Usage:
eventually(20)(() => fetch('http://i.fail.often.com/data.json'))
.then(data => console.log(data))
.catch(e => console.log(e));
function eventually<T>(
giveUpAfterNumberOfRetries: number,
nextInterval: (numberOfRetries: number) => number = linearRetryInterval
) {
return (fn: () => Promise<T>): Promise<T> => new Promise<T>((resolve, reject) => {
const retry = (retryNumber: number = 1) => {
fn()
.then(r => resolve(r))
.catch(e => {
if (retryNumber <= giveUpAfterNumberOfRetries) {
setTimeout(() => retry(retryNumber + 1), nextInterval(retryNumber));
} else {
reject(new Error(`Max retries reached. Last error: ${e}`));
}
});
};
retry();
});
}
function linearRetryInterval(numberOfRetries: number) {
return 1000 * (numberOfRetries * 0.5); // 500ms, 1000ms, 1500ms, ...
}
function constantRetryInterval(numberOfRetries: number) {
return 1000;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment