https://github.com/danilofuchs/simple-retry-promise
Retries a promise N times
https://github.com/danilofuchs/simple-retry-promise
Last synced: 8 months ago
JSON representation
Retries a promise N times
- Host: GitHub
- URL: https://github.com/danilofuchs/simple-retry-promise
- Owner: danilofuchs
- Created: 2019-07-23T21:42:55.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-04T05:12:32.000Z (over 3 years ago)
- Last Synced: 2024-08-10T21:32:23.570Z (almost 2 years ago)
- Language: TypeScript
- Size: 765 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Simple Retry Promise
Retry rejected promises until it resolves, for a maximum of N tries.
**No** exponential backoff
## Installation
```bash
$ npm i simple-retry-promise
# or
$ yarn add simple-retry-promise
```
## Example
```typescript
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`.
```typescript
retryPromise(
() => new Promise((resolve, reject) => resolve(true)),
{
maxTries: 3,
delay: 0,
shouldRetry: (err: Error) => err.code === 'ETIMEDOUT'
}
)
```
### Example with axios
`simple-retry-promise` works perfectly with [axios](https://github.com/axios/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.
```typescript
import axios, { AxiosResponse, AxiosError } from "axios";
import retryPromise from "simple-retry-promises";
async function shouldRetryOn500() {
const response = await retryPromise<
AxiosResponse,
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`
// `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.
```typescript
import axios, { AxiosResponse, AxiosError } from "axios";
import retryPromise from "simple-retry-promises";
async function getWithRetryOn500(url: string) {
const response = await retryPromise<
AxiosResponse,
AxiosError
>(
() => axios.get(url),
{
maxRetries: 3,
delay: 200,
shouldRetry: (err) =>
err.response ? err.response.status === 500 : true,
}
);
return response.data;
}
```