fishbird
Version:
Fishbird is a simple, lightweight, and fast Promise utility library
47 lines • 1.29 kB
JavaScript
;
function map(arr, fn, { concurrency = Infinity } = { concurrency: Infinity }) {
if (typeof concurrency !== "number") {
throw new TypeError(`${String(concurrency)} is not a number`);
}
if (!Array.isArray(arr)) {
throw new TypeError(`arr must be collection, but got ${typeof arr}`);
}
const fn2 = fn || ((item) => item);
return new Promise((resolve, reject) => {
let completed = 0;
let started = 0;
let running = 0;
const results = new Array(arr.length).fill(void 0);
let rejected = false;
function start(index) {
const cur = arr[index];
Promise.resolve(fn2.call(cur, cur, index, arr)).then((result) => {
running--;
completed++;
results[index] = result;
replenish();
}).catch((err) => {
rejected = true;
reject(err);
});
}
function replenish() {
if (rejected)
return;
if (completed >= arr.length) {
resolve(results);
return;
}
while (running < concurrency && started < arr.length) {
start(started);
running++;
started++;
}
}
replenish();
});
}
var map_default = map;
exports.map = map;
exports.map_default = map_default;
//# sourceMappingURL=chunk-RCO7SQLF.js.map