https://github.com/magicdawn/promise.retry
add (timeout and fail) retry for async functions
https://github.com/magicdawn/promise.retry
Last synced: over 1 year ago
JSON representation
add (timeout and fail) retry for async functions
- Host: GitHub
- URL: https://github.com/magicdawn/promise.retry
- Owner: magicdawn
- Created: 2016-05-13T08:16:35.000Z (about 10 years ago)
- Default Branch: main
- Last Pushed: 2024-08-10T06:46:29.000Z (almost 2 years ago)
- Last Synced: 2025-02-28T04:07:51.387Z (over 1 year ago)
- Language: TypeScript
- Homepage:
- Size: 454 KB
- Stars: 5
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# promise.retry
> add (timeout and fail) retry for async functions
[](https://github.com/magicdawn/promise.retry/actions/workflows/ci.yml)
[](https://codecov.io/gh/magicdawn/promise.retry)
[](https://www.npmjs.com/package/promise.retry)
[](https://www.npmjs.com/package/promise.retry)
[](http://magicdawn.mit-license.org)
## Install
```sh
$ pnpm add promise.retry
```
## Note
this package require async/await environment.
## Alternatives
- [p-retry](https://www.npmjs.com/package/p-retry), `pretry(asyncAction, options)`
- [radash.retry](https://radash-docs.vercel.app/docs/async/retry) `retry(options, asyncAction)`
`asyncAction` means a function with no parameters, give `async funtion getUser(uid: string): Promise`, u need to wrap parameter in a asyncAction: `const user = await pretry(() => getUser('zhangsan'), options)`
this package take a different approach: `const tryGetUser = pretry(getUser, options)`, this is a async wrapper has same signature as `getUser`
## API
```js
import { pretry, pretryWithCleanUp, TimeoutError, RetryError } from 'promise.retry'
```
### `pretry`
```js
const fnWithRetry = pretry(fn, options)
```
- `fn` the original async function
- `options`
- `times` : `number` try how many times
- `timeout` : `number` the timeout for each attempt, in ms
- `delay`: `number` or `(i: number) => number`, retry delay, in ms.
- `onerror` : `(err: any, i: number) => any` add extra action on an attempt error
i is always `0` based. (starts from `0`)
### `AbortSignal`
if `options.timeout` is provided, ptimeout will provide a extra runtime argument `signal?: AbortSignal`
use like below, see more at https://github.com/magicdawn/promise.timeout#singal
```ts
async fn(num: number, signal?: AbortSignal) {
signal?.addEventListener('abort', () => {
// custom clean up
})
}
const fn2 = pretry(fn, { timeout: 1000 }) // (num: number, signal?: AbortSignal) => Promise
await fn2() // <- no `signal` arg here, the `signal` in fn is provided by ptimeout at runtime, only when options.timeout specified
const fn3 = pretryWithCleanUp(fn, { timeout: 1000 }) // (num: number) => Promise
await fn3() // <- no `signal` arg here, the `signal` in fn is provided by ptimeout at runtime, only when options.timeout specified
```
### `pretryWithCleanUp`
- only difference is it will trim last `AbortSignal?` arg, see `fn2` / `fn3` signature
### TimeoutError
re-export from `promise.timeout`, see https://github.com/magicdawn/promise.timeout#api
### RetryError
if all attempts failed, `p = fnWithRetry()`, `p` will be reject with a RetryError instance.
props
- `times` : `number` same as `pretry` options
- `timeout` : `number` same as `pretry` options
- `message` : `string` the error message
- `errors` : `[err1, err2, ...]` the errors
## See Also
- [promise.timeout](https://github.com/magicdawn/promise.timeout)
- [promise.retry](https://github.com/magicdawn/promise.retry)
- [promise.map](https://github.com/magicdawn/promise.map)
- [promise.ify](https://github.com/magicdawn/promise.ify)
- [promise.cb](https://github.com/magicdawn/promise.cb)
- [promise.obj](https://github.com/magicdawn/promise.obj)
- [promise.sleep](https://github.com/magicdawn/promise.sleep)
## Changelog
[CHANGELOG.md](CHANGELOG.md)
## License
the MIT License http://magicdawn.mit-license.org