UNPKG

react-router-ga

Version:

[![Downloads](https://img.shields.io/npm/dm/react-router-ga)](https://npm.im/react-router-ga) [![Version](https://img.shields.io/npm/v/react-router-ga)](https://npm.im/react-router-ga) [![License](https://img.shields.io/npm/l/react-router-ga)](https://ope

73 lines (57 loc) 1.37 kB
'use strict'; const pMap = (iterable, mapper, options) => new Promise((resolve, reject) => { options = Object.assign({ concurrency: Infinity }, options); if (typeof mapper !== 'function') { throw new TypeError('Mapper function is required'); } const {concurrency} = options; if (!(typeof concurrency === 'number' && concurrency >= 1)) { throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); } const ret = []; const iterator = iterable[Symbol.iterator](); let isRejected = false; let isIterableDone = false; let resolvingCount = 0; let currentIndex = 0; const next = () => { if (isRejected) { return; } const nextItem = iterator.next(); const i = currentIndex; currentIndex++; if (nextItem.done) { isIterableDone = true; if (resolvingCount === 0) { resolve(ret); } return; } resolvingCount++; Promise.resolve(nextItem.value) .then(element => mapper(element, i)) .then( value => { ret[i] = value; resolvingCount--; next(); }, error => { isRejected = true; reject(error); } ); }; for (let i = 0; i < concurrency; i++) { next(); if (isIterableDone) { break; } } }); module.exports = pMap; // TODO: Remove this for the next major release module.exports.default = pMap;