Skip to content

Instantly share code, notes, and snippets.

@nickovchinnikov
Last active April 25, 2022 07:28
Show Gist options
  • Save nickovchinnikov/1f3c71fe7231022972468caa5ac2875f to your computer and use it in GitHub Desktop.
Save nickovchinnikov/1f3c71fe7231022972468caa5ac2875f to your computer and use it in GitHub Desktop.
//implement missing "Parallel" please
//try to do so with a minimal amount of code
function Parallel (options) {
var parallelJob = options.parallelJob || 1;
var jobs = [];
var result = [];
function runJobs() {
return new Promise(function(resolve) {
var jobsToRun = jobs.splice(0, parallelJob);
var runningJobs = [];
for (var key in jobsToRun) {
runningJobs.push(new Promise(function (resolve) {
jobsToRun[key](resolve);
}));
}
Promise.all(runningJobs).then(function (values) {
values.forEach(function(item){
result.push(item);
});
if (jobs.length > 0) {
runJobs().then(function () {
resolve(result);
})
}
else {
resolve(result);
}
})
});
}
return {
job: function (step) {
jobs.push(step);
return this;
},
done: function (callback) {
runJobs().then(function(values) {
callback(values);
});
}
}
}
var runner = new Parallel({ parallelJob: 2 });
runner
.job(step1)
.job(step2)
.job(step3)
.job(step4)
.done(onDone);
function step1(done) {
console.log('step1');
setTimeout(done, 10000, 'step1');
}
function step2(done) {
console.log('step2');
setTimeout(done, 1000, 'step2');
}
function step3(done) {
console.log('step3');
setTimeout(done, 5000, 'step3');
}
function step4(done) {
console.log('step4');
setTimeout(done, 7000, 'step4');
}
function onDone(results) {
console.log(results);
console.assert(Array.isArray(results), 'expect result to be array');
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');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment