1.1.5 • Published 4 years ago

promisedip v1.1.5

Weekly downloads
-
License
MIT
Repository
gitlab
Last release
4 years ago

pipeline status coverage report npm version Downloads js-standard-style Commitizen friendly

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:

Installation

NPM

npm i -S promisedip
yarn add promisedip

JavaScript module

<script type="module">
  import PromisePool from 'https://unpkg.com/promisedip@1.0.2/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], …)
  • 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