- Notifications
You must be signed in to change notification settings - Fork0
mkg0/promise-effects
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Fully typed promise effects to play with async handlers in a pleasent way.
Effect | Desc |
---|---|
retryPromise | Converts a promise creator to repetitive |
wait | Creates a promise to resolve for the given time long. |
observePromise | Creates observable promises from the given promise |
timeout | Timeout example |
Polling | ⏱ Polling example |
Latest | ⏱ |
CancelablePromise | ⏱ |
Install package
npm install promise-effects
Import module
import{retryPromise}from'promise-effects'// orimportretryPromisefrom'promise-effects/retryPromise'
It's a high-order function that gives the capabilify of retry to a function that creates promise.
constrepetitiveFetch=retryPromise(fetch,{retry:3,onReconnecting:({ attemptNumber})=>console.log(`Fetching has failed(${attemptNumber})... Retrying...`),})repetitiveFetch('https://www.mocky.io/v2/5185415ba171ea3a00704eed').then(resp=>resp.json()).then(console.log).catch(()=>console.log('Failed!'))// > Fetching has failed(1)... Retrying...// > Fetching has failed(2)... Retrying...// > Fetching has failed(3)... Retrying...// > Failed!
Option Name | Type |
---|---|
onReconnecting | fn:({attemptNumber: number, remainingTries: number, error: Error}) |
delay | number |
delay | { delay: number, factor: number, max?: number, min?: number } |
delay | `fn: ({attemptNumber: number, remainingTries: number, error: Error}) => number |
shouldRetry | `fn: ({attemptNumber: number, remainingTries: number, error: Error}) => booleaan |
retry | number |
It wraps promises to observe the status. You can get if the promisefulfilled
,rejected
orpending
. It's beneficial on test purposes.
constobserved=observePromise(fetch('http://google.com'))console.log(observed.isPending())// > trueconsole.log(observed.isRejected())// > falseconsole.log(observed.isFulfilled())// > falseconsole.log(observed.status)// > 'PENDING'observed.then(result=>{console.log(observed.status)// > 'RESOLVED'console.log(observed.isFulfilled())// > true}).catch(()=>{console.log(observed.status)// > 'REJECTED'console.log(observed.isRejected())// > true})
Creates a promise to resolve for the given time long.
constprintMessage=(count=0)=>Promise.resolve().then(()=>console.log(`You will see this message every second(${count})`)).then(()=>wait(1000).then(()=>printMessage(count+1)))printMessage()// > You will see this message every second(0)// > You will see this message every second(1)// > You will see this message every second(2)// > You will see this message every second(3)// > ...
You don't need an exclusive timeout function for timeout. Usewait
withES Promise.race instead.
// fail in 1 secPromise.race([fetch('https://www.mocky.io/v2/5185415ba171ea3a00704eed?mocky-delay=1200ms').then(res=>resp.json()),wait(1000).then(()=>Promise.reject('Timeout!'))])// > Uncaught (in promise) Timeout!
// will mock response if the first request doesn't resolve in 1 secconstresult=awaitPromise.race([fetch('https://www.mocky.io/v2/5185415ba171ea3a00704eed?mocky-delay=1200ms').then(res=>resp.json()),wait(1000).then(()=>({hello:'mock'}))])console.log(result)// > { hello: 'mock' }
All notable changes to this project will be documented in thechangelog file.
About
Promise effects like retry, timeout, observation over promises for advanced use cases or test purposes.
Topics
Resources
Stars
Watchers
Forks
Packages0
No packages published