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());