Есть пример код который запускает задачи параллельно и сохраняет все результаты в массив. Но тут не ясно как сохранить результаты в том порядке, как были запущены в примере.
вот сам код(
codepen):
class Parallel {
constructor(number) {
this.parallelJobs = number.parallelJobs;
this.results = [];
this.currentJobs = 0;
this.counterCalls = 0;
this.countJobCalls = 0;
}
pushArray(value) {
if (this.results.length && this.results.length !== this.counterCalls) {
setTimeout(() => {
this.pushArray(value, callNumber)
}, 50);
} else {
this.results.push(value);
this.counterCalls++;
}
this.currentJobs--;
return true;
}
runFunc(runConsole) {
this.currentJobs++;
runConsole(this.pushArray.bind(this));
}
job(runConsole) {
this.countJobCalls++;
if (this.currentJobs < this.parallelJobs) {
this.runFunc(runConsole);
} else {
setTimeout(() => {
this.job(runConsole);
}, 500);
}
return this;
}
done(onDone) {
this.lastJobCall = this.countJobCalls;
if (this.results.length && this.lastJobCall === this.results.length) {
onDone(this.results);
} else {
setTimeout(() => {
this.done(onDone)
}, 50);
}
return true;
}
}
var runner = new Parallel({
parallelJobs: 4
});
runner.job(step1)
.job(step2)
.job(step3)
.job(step4)
.done(onDone);
function step1(done) {
console.log('step1');
setTimeout(done, 100, 'step1');
}
function step2(done) {
console.log('step2');
setTimeout(done, 10, 'step2');
}
function step3(done) {
console.log('step3');
setTimeout(done, 150, 'step3');
}
function step4(done) {
console.log('step4');
setTimeout(done, 50, 'step4');
}
function onDone(results) {
console.log(results);
}
В итоге нужно получить массив ["step1", "step2", "step3", "step4"]