async-parallel
Version:
Async enabled each(), map(), filter() functions that work just like their standard counterparts, but can be used with async/await and also provide concurrency limiting. Includes built-in typings and JSDoc comments for IntelliSense documentation.
189 lines • 7.13 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
class MultiError extends Error {
constructor(list) {
super(`${list.length} errors`);
this.list = list;
}
}
exports.MultiError = MultiError;
exports.concurrency = 0;
function setConcurrency(value) {
exports.concurrency = value;
}
exports.setConcurrency = setConcurrency;
function each(list, action, options) {
return __awaiter(this, void 0, void 0, function* () {
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0)
yield action(list.shift());
return list.length > 0;
}));
}
});
}
exports.each = each;
function every(list, action, options) {
return __awaiter(this, void 0, void 0, function* () {
var result = true;
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
var i = 0;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0)
if (!(yield action(list.shift(), i++, list)))
result = false;
return !result || list.length > 0;
}));
}
return result;
});
}
exports.every = every;
function filter(list, action, options) {
return __awaiter(this, void 0, void 0, function* () {
var result = [];
if (list && list.length > 0) {
var clone = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
var i = 0;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (clone.length > 0) {
var j = i++;
var value = clone.shift();
if (yield action(value, i, clone))
result[j] = value;
}
return clone.length > 0;
}));
}
return result.filter(value => value !== undefined);
});
}
exports.filter = filter;
function invoke(list, options) {
return __awaiter(this, void 0, void 0, function* () {
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0)
yield list.shift().call(this);
return list.length > 0;
}));
}
});
}
exports.invoke = invoke;
function map(list, action, options) {
return __awaiter(this, void 0, void 0, function* () {
var result = [];
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
var i = 0;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0) {
var j = i++;
result[j] = yield action(list.shift(), j, list);
}
return list.length > 0;
}));
}
return result;
});
}
exports.map = map;
function pool(size, task) {
return __awaiter(this, void 0, void 0, function* () {
var active = 0;
var done = false;
var errors = [];
return new Promise((resolve, reject) => {
next();
function next() {
while (active < size && !done) {
active += 1;
task()
.then(more => {
if (--active === 0 && (done || !more))
errors.length === 0 ? resolve() : reject(new MultiError(errors));
else if (more)
next();
else
done = true;
})
.catch(err => {
errors.push(err);
done = true;
if (--active === 0)
reject(new MultiError(errors));
});
}
}
});
});
}
exports.pool = pool;
function reduce(list, action, value, options) {
return __awaiter(this, void 0, void 0, function* () {
var result = value;
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
var i = 0;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0)
result = yield action(result, list.shift(), i++, list);
return list.length > 0;
}));
}
return result;
});
}
exports.reduce = reduce;
function sleep(milliseconds) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise(resolve => setTimeout(() => resolve(), milliseconds));
});
}
exports.sleep = sleep;
function some(list, action, options) {
return __awaiter(this, void 0, void 0, function* () {
var result = false;
if (list && list.length > 0) {
list = list.slice(0);
var size = resolveOptions(options).concurrency || list.length;
var i = 0;
yield pool(size, () => __awaiter(this, void 0, void 0, function* () {
if (list.length > 0)
if (yield action(list.shift(), i++, list))
result = true;
return result || list.length > 0;
}));
}
return result;
});
}
exports.some = some;
function resolveOptions(value) {
if (typeof value === 'number')
return { concurrency: value };
else if (typeof value === 'object')
return Object.assign({ concurrency: exports.concurrency }, value);
else
return { concurrency: exports.concurrency };
}
//# sourceMappingURL=index.js.map
;