@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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы