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');
...