Перейти до основного вмісту
Модуль 8 · Урок 4 із 432/32 у курсі~15 min
Модульні уроки (4/4)

Завдання: планування за допомогою Promises

«Планування» означає рішення, як запускати список асинхронних завдань: усі разом, по одному, або невеликими групами. Ми об’єднаємо Promise.all, for await та закриття.

Паралельно: всі разом

Коли завдання незалежні та швидкі, запустіть їх усі та зачекайте з Promise.all:

JS
async function inParallelo(tasks) {
  return Promise.all(tasks.map((t) => t()));
}

const risultati = await inParallelo([
  () => Promise.resolve(1),
  () => Promise.resolve(2),
  () => Promise.resolve(3),
]);
// [1, 2, 3]

Загальний час ≈ час виконання найповільнішого завдання.

Серіально: по одному

Коли кожне завдання залежить від попереднього або ви хочете обмежити швидкість:

JS
async function inSerie(tasks) {
  const risultati = [];
  for (const t of tasks) {
    risultati.push(await t());
  }
  return risultati;
}

Загальний час ≈ сума часів.

З обмеженням одночасності

Іноді вам не потрібна тисяча одночасних запитів, але ви не хочете їх чекати будь-яка серія: вам потрібно максимум N у польоті.

JS
async function conLimite(tasks, n) {
  const risultati = new Array(tasks.length);
  let i = 0;
  async function worker() {
    while (i < tasks.length) {
      const mio = i++;
      risultati[mio] = await tasks[mio]();
    }
  }
  await Promise.all(Array.from({ length: n }, worker));
  return risultati;
}

Ідея: ви запускаєте n "робочих", які захоплюють наступний індекс, поки нічого не залишиться.

Спробуйте

вправи#js.m8.l4.e1
Спроби: 0Завантаження…

Визначте `inSeries(tasks)` async: задано масив функцій, які повертають Promises, запускайте їх по черзі (очікуйте) і повертайте масив результатів у порядку виконання.

Завантаження редактора…
Показати підказку

for ... of і push(await t())

Рішення доступне після 3 спроб

Повторна вправа

вправи#js.m8.l4.e2
Спроби: 0Завантаження…

Визначте `inParallel(tasks)` async: задано масив функцій, які повертають Promises, запустіть їх усі паралельно та поверніть масив результатів у тому самому порядку, що й вхідні дані. Використовуйте Promise.all.

Завантаження редактора…
Показати підказку

Promise.all(tasks.map((t) => t()))

Рішення доступне після 3 спроб