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

Задача: планирование с помощью обещаний

«Планирование» означает решение как запускать список асинхронных задач: все вместе, по одному, или в небольших группах. Мы объединим 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)` асинхронно: учитывая массив функций, возвращающих обещания, запускайте их по одному (ожидайте) и возвращайте массив результатов в порядке выполнения.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m8.l4.e2
Попыток: 0Загрузка…

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

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток