@dxzm

Как правильно организовать параллельную работу в js?

Есть пример код который запускает задачи параллельно и сохраняет все результаты в массив. Но тут не ясно как сохранить результаты в том порядке, как были запущены в примере.

вот сам код(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"]
  • Вопрос задан
  • 897 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
petermzg
@petermzg
Самый лучший программист
Javascript однопоточный. Параллельности тут нет.
Хотите многопоточность, используйте web workers
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы