Как реализовать класс 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;
}
}