Skip to content

Instantly share code, notes, and snippets.

@alexkrolick
Created August 11, 2017 17:43
Show Gist options
  • Save alexkrolick/68f7175a214f3cff3e06bb9b3c18cdc0 to your computer and use it in GitHub Desktop.
Save alexkrolick/68f7175a214f3cff3e06bb9b3c18cdc0 to your computer and use it in GitHub Desktop.
Async retry utility for Node
const backoffFns = {
constant: curDelay => curDelay,
geometric: curDelay => curDelay * 2,
}
const defaultOpts = {
maxTries: 2,
delay: 0,
backoff: 'constant',
logger: console.log,
}
const defaultState = {
tries: 0,
delay: 0,
errors: [],
}
async function retry (fn, opts, state) {
opts = Object.assign({}, defaultOpts, opts)
state = Object.assign({}, defaultState, state)
try {
await fn()
} catch (err) {
const curDelay = state.tries === 0 ? opts.delay : state.delay;
if (state.tries < opts.maxTries) {
await new Promise((resolve, reject) => setTimeout(resolve, curDelay))
await retry(fn, opts, {
tries: state.tries + 1,
delay: backoffFns[opts.backoff](curDelay),
errors: state.errors.concat(err),
})
} else {
opts.logger('Max retries reached', state.errors)
throw Error('Max retries reached')
}
}
}
module.exports = retry
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment