promisedip
v1.1.6
Published
Promise pooler to manage concurrency
Downloads
156
Maintainers
Readme
NOTE: This lib exposes next-gen code ; this means that you might need polyfills in old environments (e.g.: node < 7.6 or IE).
It ships with:
- async/await syntax: not supported in IE and NodeJS < 7.6.0 (MDN)
- ES6 classes: not supported in IE and NodeJS < 6 (MDN)
- class static method not supported in IE and NodeJS < 6 (MDN)
- Number.isFinite not supported in IE and NodeJS < … 0.10 (wow that's oold) (MDN)
- Number.isInteger not supported in IE and NodeJS < … 0.12 (wow that's very old too) (MDN)
Installation
NPM
npm i -S promisedip
yarn add promisedip
JavaScript module
<script type="module">
import PromisePool from 'https://unpkg.com/[email protected]/lib/PromisePool.esm.js';
// …
</script>
Demo
I made a codesandox to visualize the promise pooling (in the console)
API
NB: Everything is TypeScript-friendly
new PromisePool(options)
Usage:
new PromisePool(options: { concurrency: number })
Example
import PromisePool from 'promisedip'
const pool = new PromisePool({ concurrency: 2 })
async function doStuff (): Promise<void> {
const [
examplePage,
wordscapePage,
wiki,
] = await Promise.all([
// pool will execute the following promises in the correct order respecting the concurrency option provided
pool.resolve(() => fetch('https://example.com/')),
pool.resolve(() => fetch('https://wordscape.com/')),
pool.resolve(async () => {
const response = await fetch('https://en.wikipedia.org/')
// … do anything else you need
return response
}),
// and so on…
])
}
PromisePool.map()
Usage
PromisePool.map<T, U>(
array: Array<T>,
mapper: (item: T, index: number, array: Array<T>) => Promise<U>,
options: { concurrency: number },
): Promise<U[]>
Example
import PromisePool from 'promisedip'
const pages = [
'https://example.com/',
'https://wordscape.com/',
'https://en.wikipedia.org/',
]
async function main (): Promise<void> {
const results: string[] = await PromisePool.map(
pages,
async (page) => {
const response = await fetch(page)
return response.text()
},
{ concurrency: 2 },
)
}
Troubleshooting
PromisePool.map(readOnlyArray, …)
does not work with a readonly array- Use
PromisePool.map([...readOnlyArray], …)
- Use
- The lib does not seem to work with Node, or TypeScript, or anywhere except the browser
- TL;DR: install a version >= 1.1.4
- Explanation: I made successive mistakes in the build process, I didn't master fully exports map nor rollupjs for building UMD, CommonJS AND ESModule outputs. Now everything is fine.
Why
This package is clearly not the only one to perform promise pooling. So why "yet another …" ?
Because …
- I wanted a dependency-free package that I could use for frontend projects
- Since I intend to use it on frontend apps, I wanted it to be extremely lightweight: the JavaScript module build is less than 1kB
- I wanted a pooler that I could use at different scopes, from very global to very local
- I wanted to be able to add promises in the stack on the fly
- I wanted a proper naming
- I wanted proper typings
- I wanted JavaScript modules