Как реализовать класс Parallel таким образом, чтобы обработка операций происходила параллельно?

Максимальное количество задач, которые работают параллельно, не должно превышать значение parallelJobs, которое передается в конструктор класса.

    const runner = new Parallel({
      parallelJobs: 2
    });
    runner.job(step1)
    .job(step2)
    .job(step3)
    .job(step4)
    .done(onDone);

    function step1(done) {
      setTimeout(done, 100, "step1");
    }

    function step2(done) {
      setTimeout(done, 10, "step2");
    }

    function step3(done) {
      setTimeout(done, 150, "step3");
    }

    function step4(done) {
      setTimeout(done, 50, "step4");
    }

    function onDone(results) {
      console.assert(Array.isArray(results), "result must be an array");
      console.assert(results.length == 4, "Wrong count of answers");
      console.assert(results[0] === "step1", "Wrong answer 1");
      console.assert(results[1] === "step2", "Wrong answer 2");
      console.assert(results[2] === "step3", "Wrong answer 3");
      console.assert(results[3] === "step4", "Wrong answer 4");
    }

Ответы (1 шт):

Автор решения: Zhanat Lepesbayeva

Author: @Shchogolev

  function CustomPromise (callback) {
  this.isResolved = false;

  this.promise = new Promise(resolve => callback((response) => {
    this.isResolved = true;
    console.log("res",response)
    resolve(response);
  }));
}

class Parallel {
  constructor(options, promise ) {
    this.parallelJobs = options.parallelJobs;
    this.promise = promise || [];
  }
  job(callback) {
    const promise = [...this.promise ]
    const numberUnfinished = () => promise.filter(el => !el.isResolved).length
    if (numberUnfinished() < this.parallelJobs) {
      this.promise.push(new CustomPromise(callback))
    } else {
      this.promise.push(new CustomPromise((res) => {
        (async() => {
        while(numberUnfinished() >= this.parallelJobs){
          await Promise.race(promise.filter(el => !el.isResolved).map(el => el.promise))
        }
        callback(res)
        })()
      }))
    }
    return this
  }
  done(callback) {
    Promise.all(this.promise.map(el => el.promise)).then(callback)
return this;
  }
}
→ Ссылка