1.0.1 • Published 5 years ago
simple-retry-promises v1.0.1
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;
}