u-promised

Promise based retry and backoff, bring your own Promises

MIT License

Downloads
9
Stars
5

u-promised

Promise based retry and backoff, bring your own Promises

npm install u-promised

API

retry(retries, fn)

  • retries:
    • number (0 - ...)
    • -1 (retry forever)
    • function (evaluated after each attempt; should return boolean)
  • fn: function that returns a promise

import { get } from 'highwire'
import { retry } from 'u-promised'

const fetchGoogle = () => get('http://google.com')

retry(3, fetchGoogle)
  .then((google) => console.log(google))
  .catch((err) => console.log('Oops, 4 attempts total', err))

// retry forever - no catch
retry(-1, fetchGoogle)
  .then((google) => console.log(google))

// evalute retries
const evalRetry = () => {
  let index = 0
  return () => {
    if (index === 5) return false
    index++
    return true
  }
}

retry(evalRetry(), fetchGoogle)
  .then((google) => console.log(google))
  .catch((err) => console.log('Oops, 6 attempts total', err))

backoff(delay, incrementor, retries, fn)

  • delay: initial delay after first failure
  • incrementor: increment to add to delay after each attempt
  • retries:
    • number (0 - ...)
    • -1 (retry forever)
    • function (evaluated after each attempt; should return boolean)
  • fn: function that returns a promise

import { get } from 'highwire'
import { backoff } from 'u-promised'

const fetchGoogle = () => get('http://google.com')
const SECOND = 1000

backoff(SECOND, SECOND, 3, fetchGoogle)
  .then((google) => console.log(google))
  .catch((err) => console.log('Oops, 4 attempts total', err))

// backoff forever
backoff(SECOND, SECOND, -1, fetchGoogle)
  .then((google) => console.log(google))

// evaluate backoff
const evalBackoff = () => {
  let index = 0
  return () => {
    if (index === 5) return false
    index++
    return true
  }
}

backoff(SECOND, SECOND, evalBackoff(), fetchGoogle)
  .then((google) => console.log(google))
  .catch((err) => console.log('Oops, 6 attempts total', err))

Developing

There's really not much to this codebase. Just run npm test. If you would like to contribute, please open an issue explaining what you would like to change/fix/add and make a pull request.