Execute concurrently
by Artem
JavaScript
'use strict';
const delay = ms => new Promise(r => {
setTimeout(r, ms * 1000, ms);
});
const tasks = [
[delay, 1],
[delay, 1],
[delay, 3],
[delay, 1],
[delay, 2],
[delay, 3],
];
const executeConcurrently = (tasks, limit = 2) => {
return new Promise((resolve) => {
const running = [];
const results = [];
let start = 0;
let end = limit;
let nextChunk = tasks.slice(start, end);
let p = Promise.resolve();
p = p.then(() => {
execChunk(nextChunk);
});
const execChunk = nextChunk => {
Promise.all(nextChunk.map(([task, delay]) => task(delay)))
.then((r) => {
results.push(...r);
start = end;
end += limit;
nextChunk = tasks.slice(start, end);
if (nextChunk.length > 0) {
execChunk(nextChunk);
} else {
resolve(results);
}
})
};
});
};
console.time();
executeConcurrently(tasks, 2)
.then((results) => console.log('All tasks have been executed ', results))
.finally(() => console.timeEnd());