Simple Retry Promise
Retry rejected promises until it resolves, for a maximum of N tries.
No exponential backoff
Installation
$ npm i simple-retry-promise
$ yarn add simple-retry-promise
Example
import retryPromise from "simple-retry-promises";
retryPromise(
() => new Promise((resolve, reject) => resolve(true)),
{
maxTries: 3,
delay: 0,
shouldRetry: (err) => 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.response ? err.response.status === 500 : true,
}
);
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;
}