1.0.1 • Published 5 years ago

simple-retry-promises v1.0.1

Weekly downloads
4
License
ISC
Repository
github
Last release
5 years ago

Simple Retry Promise

Retry rejected promises until it resolves, for a maximum of N tries. No exponential backoff

Installation

$    npm i simple-retry-promise
# or
$    yarn add simple-retry-promise

Example

import retryPromise from "simple-retry-promises";

retryPromise(
    () => new Promise((resolve, reject) => resolve(true)),
    {
        maxTries: 3,                // mandatory
        delay: 0,                   // defaults to 3000 ms
        shouldRetry: (err) => true, // defaults to `() => true`
    }
)

Typescript

retryPromise can be used with two type parameters. The first (T) is the expected return type of the Promise. E is the type of Error you will receive in shouldRetry.

retryPromise<boolean, Error>(
    () => new Promise<boolean>((resolve, reject) => resolve(true)),
    {
        maxTries: 3,
        delay: 0,
        shouldRetry: (err: Error) => err.code === 'ETIMEDOUT'
    }
)

Example with axios

simple-retry-promise works perfectly with axios.

The following snippet retries the request everytime the fake endpoint returns status 500, for a maximum of 3 times, with a delay of 200ms between an error and the next request.

import axios, { AxiosResponse, AxiosError }  from "axios";
import retryPromise from "simple-retry-promises";

async function shouldRetryOn500() {
    const response = await retryPromise<
            AxiosResponse<unknown>,
            AxiosError
        >(
            () => axios.get("https://httpbin.org/status/500"),
            {
                maxRetries: 3,
                delay: 200,
                shouldRetry: (err) => // err is of type `AxiosError`
                    err.response ? err.response.status === 500 : true,
        }
    );

    // `response` will be of type `AxiosResponse<unknown>`
    // `response.data` will be of type `unknown`

    return response.data;
}

A more realistic use case would be to retry every GET request to a given endpoint when 500 is received.

import axios, { AxiosResponse, AxiosError }  from "axios";
import retryPromise from "simple-retry-promises";

async function getWithRetryOn500<T = unknown>(url: string) {
    const response = await retryPromise<
            AxiosResponse<T>,
            AxiosError
        >(
            () => axios.get<T>(url),
            {
                maxRetries: 3,
                delay: 200,
                shouldRetry: (err) =>
                    err.response ? err.response.status === 500 : true,
        }
    );

    return response.data;
}