JSFiddle - React, Tailwind, and code Playground

by Anton Spirin

JavaScript

function Parallel(settings) {
  this.parallelJobs = settings.parallelJobs;
  this.results;
  this.tasks = [];
  this.onDone;
  this.index = 0;
  this.activeJobs = 0;
  
  this.start = function() {
    this.results = Array(this.tasks.length);
    
    for (var i = 0; i < Math.min(this.parallelJobs, this.tasks.length); i++) {
      this.next();
    }
  }
  
  this.next = function(result) {
      var index = this.index;
      this.activeJobs++;
     

      this.tasks[this.index](function(result) {
        this.onResult(result, index);
      }.bind(this));

      this.index++;
  }
  
  this.onResult = function(result, index) {
    this.results[index] = result;
    this.activeJobs --;
    
    if(this.tasks[this.index]) {
      this.next();
     } else if (this.activeJobs === 0) {
      this.onDone(this.results);
    }
  }
  
  this.job = function (step) {
    this.tasks.push(step);
    return this;
  };
  
  this.done = function (onDone) {
     this.onDone = onDone;
     this.start();
  };
};



var runner = new Parallel({
    //the number of simultaneously possible jobs, other jobs should be placed in queue.
        parallelJobs: 2
    });

    runner.job(step1)
        .job(step2)
        .job(step3)
        .job(step4)
        .done(onDone);

    function step1(done) {
        console.log('step1');
        for ( let i = 0; i <= 10e4; i++ ) ;
        console.log('end step1 cicle');
        setTimeout(done, 1000, 'hello world');
    }

    function step2(done) {
        console.log('step2');
        for ( let i = 0; i <= 10e2; i++ ) ;
        console.log('end step2 cicle');
        setTimeout(done, 1200, 'Job succeded');
    }

    function step3(done) {
        console.log('step3');
        for ( let i = 0; i <= 10e3; i++ ) ;
        console.log('end step3 cicle');
        setTimeout(done, 1500, 'step3');
    }

    function step4(done) {
        console.log('step4');
        for ( let i = 0; i <= 10e1; i++ ) ;
        console.log('end step4 cicle');
       ...