Запускать основные задачи параллельно, а подзадачи - последовательно / зависимо - PullRequest
0 голосов
/ 22 апреля 2020

Итак, у меня есть сценарий использования, где у меня есть 5 основных задач, внутри основных задач есть 3 подзадачи (скажем, асинхронные операции ввода / вывода). Основные задачи независимы, а подзадачи в рамках одной основной задачи зависят друг от друга. Я могу выполнять все задачи последовательно, но это будет огромной тратой процессорного времени. Мне нужен способ использовать asyn c -await и Promise для параллельного запуска всех основных задач, а внутри каждой основной задачи запускать последовательные асинхронные задачи.

1 Ответ

0 голосов
/ 22 апреля 2020

Решение, которое я пришел с использованием ванили JavaScript async await и Promise

async function myFunc() {
  const list = ["MainA:", "MainB:", "MainC:", "MainD:", "MainE:"];
  let allPromises = [];
  list.forEach(main => {
    allPromises.push(runSubTasks(main));
  });
  console.log("allPromises before settle:", allPromises);
  let data = await Promise.all(allPromises);
  console.log("allPromises after settle:", allPromises);
  console.log("resolved values inside allPromises:", data);
  // All main tasks are done by this point
}

myFunc();

async function runSubTasks(main) {
  const one = await asyncSubTask1(main, "");
  const two = await asyncSubTask2(main, one);
  return asyncSubTask3(main, two);
  // or
  // const three = await runTask3(main, two);
  // return three;
}

function asyncSubTask1(main, sub) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      console.log(`${main}${sub}1`);
      res(`${sub}1`);
    }, Math.random() * 10000);
  });
}
function asyncSubTask2(main, sub) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      console.log(`${main}${sub}2`);
      res(`${sub}2`);
    }, Math.random() * 10000);
  });
}
function asyncSubTask3(main, sub) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      console.log(`${main}${sub}3`);
      res(`${main}${sub}3`);
    }, Math.random() * 10000);
  });
}
...