UNPKG

repeat-promise-until-resolved

Version:

A utility for easily repeating a promise-based task, until it succeeds. Works both in Node and in the browser.

110 lines (77 loc) 3.94 kB
A utility for easily repeating a promise-based task, until it succeeds. Works both in Node and in the browser. ## Installation ```sh $ npm install repeat-promise-until-resolved ``` # Table of Contents - [Examples](#examples) * [Usage](#usage) * [Basic example](#basic-example) * [Additional configuration](#additional-configuration) - [API](#api) ## Examples #### Usage In a node-based environment: ```javascript const repeatPromiseUntilResolved = require('repeat-promise-until-resolved'); ``` If you're using it in the browser, without any build system, simply expose it to the global object: ```html <script src="node_modules/repeat-promise-until-resolved/index.js"></script> ``` &nbsp; #### Basic example ```javascript const repeatPromiseUntilResolved = require('repeat-promise-until-resolved'); const axios = require('axios'); (async()=>{ //Create a function that returns a promise, which you want to repeat until resolved. If you're not familiar with async functions, note that they return a promise. async function promiseFactory() { const { data } = await axios('https://jsonplaceholder.typicode.com/todos/1') console.log(data) } try { //Pass the promise-producing function, and an optional config object. The default maxAttempts value is 3. await repeatPromiseUntilResolved(promiseFactory, { maxAttempts: 3});//Will be performed 3 times at most, until it finally fails. } catch (error) {//An error will be thrown, only after the final failing attempt. console.log('final fail',error) } })() ``` &nbsp; #### Additional configuration ```javascript (async()=>{ async function promiseFactory() { const { data } = await axios('https://jsonplaceholder.typicode.com/todos/1') console.log('success',data) } //Hook into each attempt, and receive the attempt number const onAttempt = (attempt) => { console.log(attempt); } //Hook into every error thrown, and receive the Error object and the attempt number. const onError = (error, attempt) => { console.log(error.message, attempt); } try { //Limit to 5 attempts, and create a delay of 2 seconds between each attempt. timeout: Wait up to 5 seconds for each promise to resolve, until it's manually rejected(and retried) //Also pass functions to the hooks. await repeatPromiseUntilResolved(promiseFactory, { maxAttempts: 5, delay: 2000, timeout:5000, onAttempt, onError }); } catch (error) { console.log('final fail',error) } })() ``` #### API ### function repeatPromiseUntilResolved(promiseFactory,config):Promise | Parameter | type | Description | | ----------- |---- | ------------------------------------------------------------ | | promiseFactory | function | A function that returns the promise you want to "repeat" | | config | object| A configuration and hook object. Not required| | config.maxAttempts | number| Number of maximum attempts(including the first one) | | config.delay | number| Number of milliseconds to wait between each retry. Useful in network requests | | config.timeout | number| Number of milliseconds to wait, until the promise is manually rejected. Default is 8000 | | config.onAttempt | function| Hook into each attempt. Receives the number of the current attempt as an argument | | config.onError | function| Hook into each failed attempt. Receives the Error object as an argument | | config.shouldStop | function| Hook into each failed attempt. Receives the Error object as an argument. Return true, if you want the repetition to stop |